-
问题描述
MySQL中设置text数据类型为索引时需要指定长度,这里的长度是指:
- 字节?
- 还是字符?
- 还是位?
MySQL中字符串数据类型有(M表示可以指定长度):
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等概念就是字符这个层面的。
- ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。
- UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
- Unicode编码中,一个英文等于两个字节,一个中文(含繁体)等于两个字节。文本符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。
- UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。
- UTF-32编码中,世界上任何字符的存储都需要4个字节。
-
MySQL长度
varchar
定义的长度单位是字符。中英文字幕都被当做一个字符来看,最大长度取决于使用的字符集。(存疑)text
定义的是字节:-
TEXT
:65,535 bytes,64kb; -
MEDIUMTEXT
:16,777,215bytes,16Mb; -
LONGTEXT
:4,294,967,295 bytes,4Gb;
-
-
查询长度的函数
-
查询部分字符串
-
Reference