MySQL中TEXT的长度是字符还是字节?以及查询方法

时间:2024-05-20 21:53:10
  • 问题描述

    MySQL中设置text数据类型为索引时需要指定长度,这里的长度是指:

    • 字节
    • 还是字符
    • 还是

    MySQL中字符串数据类型有(M表示可以指定长度):

    MySQL中TEXT的长度是字符还是字节?以及查询方法

    MySQL5.0.3之前varchar(n)这里的n表示字节

    MySQL5.0.3之后varchar(n)这里的n表示字符数。

    mysql varchar(50) 不管中文 还是英文 都是存50个的,但是一个表中所有varchar字段的总长度跟编码有关,如果是utf-8,那么大概65535/3,如果是gbk,那么大概65535/2.

    CHAR(M)中的M表示字节。因为是定长字符串,如果实际字符串实际长度不足M,会自动补齐右侧空格。

  • 解决方案

    按实际的从小到大先来理清概念:

  • 位 bit

    位,是计算机概念,指计算机硬件的最小存储单元。这个单元上只能存储两种值:1、0。

    用1和0表示具体的意义就是二进制表示方法,二进制使用8个1或0为一组表示实际意义。

    即8位(bit)表示一个概念,这个概念就是字节(byte)。

  • 字节byte

    字节,是计算机实际可用的最小存储单元。

    1个字节有8位。

  • 字符 characters

    字符,是字的符号,是给人看的。

    位、字符都是给计算机看的。

    不同的编码方式,字符是不一样的,ASCII、UTF-8等概念就是字符这个层面的。

    1. ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。
    2. UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
    3. Unicode编码中,一个英文等于两个字节,一个中文(含繁体)等于两个字节。文本符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。
    4. UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。
    5. UTF-32编码中,世界上任何字符的存储都需要4个字节。
  • MySQL长度

    varchar定义的长度单位是字符。中英文字幕都被当做一个字符来看,最大长度取决于使用的字符集。(存疑)

    text定义的是字节

    • TEXT:65,535 bytes,64kb;
    • MEDIUMTEXT:16,777,215bytes,16Mb;
    • LONGTEXT:4,294,967,295 bytes,4Gb;
  • 查询长度的函数
    • LENGTH() : Return the length of a string in bytes

      字节数,受编码方式影响。

    • CHAR_LENGTH(): Return number of characters in argument

      查询字符数,多字节字符算一个单字符。

  • 查询部分字符串
    • left(str, length)
    • right(str, length)
    • substring(被截取字段,从第几位开始截取)
    • substring_index(str,delim,count)

      substring_index(被截取字段,关键字,关键字出现的次数)

  • Reference

  1. MySQL的varchar定义长度到底是字节还是字符
  2. MySQL CHAR、VARCHAR、TEXT、ENUM、SET(字符串类型)
  3. MySQL VARCHAR字段最大长度到底是多少