-
问题描述
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;
-
查询长度的函数
-
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
- MySQL的varchar定义长度到底是字节还是字符
- MySQL CHAR、VARCHAR、TEXT、ENUM、SET(字符串类型)
- MySQL VARCHAR字段最大长度到底是多少