字符串类型主要包括 CHAR, VARCHAR, BINARY, VARBINARY, BLOB, TEXT, ENUM, 和SET。
其中,BINARY,VARBINARY,BLOB等是二进制字符串。
CHAR[(M)]、BINARY[(M)]
定长字符串,在存储时总是用右边的空格填充到指定长度。M代表以字符为单位的列长度。M的范围是0到255。如果省略M,长度为1。
MYSQL可以定义CHAR(0),它可以有两个用途:
- 依赖列的存在但实际上不使用其值
- 只允许两个值NULL 和’'(空串)
在检索时CHAR列中的尾部空格会被删除,插入时,长度不够M的会填充空格。
BINARY 同CHAR ,只是数据是二进制字符串
VARCHAR(M)、VARBINARY [M]
边长字符串,M的范围是0到65535。VARCHAR的有效最大长度受最大行大小(65535字节,由所有列共享)和使用的字符集的限制。注意,BLOB和TEXT列对行的大小限制只贡献了9到12个字节。
MySQL将VARCHAR值存储为一个1字节或2字节的长度前缀加上数据。长度前缀表示该值的字节数。如果一个VARCHAR列需要不超过255字节的值,则使用一个长度字节,如果值可能需要超过255字节,则使用两个长度字节。
对于VARCHAR列,无论使用何种SQL模式,超过列长的尾部空间都会在插入前被截断,并产生警告。对于CHAR型列,无论使用何种SQL模式,都会默默地截断插入值中多余的尾部空间。在严格模式下,超长会报错。
VARBINARY同VARCHAR,只是数据是二进制字符串
TINYBLOB、TINYTEXT
TINYBLOB 最大255字节,每个TINYBLOB值都使用一个1字节的长度前缀来存储,表示该值的字节数。
TINYTEXT 最大255字节,如果值包含多字节的字符,有效的最大长度会更小。每个TINYTEXT值都使用一个1字节的长度前缀来存储,表示该值的字节数
BLOB[(M)] 、TEXT
一个BLOB列,最大长度为65,535( 2 16 2^{16} 216-1)字节。每个BLOB值都使用一个2字节的长度前缀来存储,表示该值的字节数;TEXT类似;
TEXT和BLOB插入值时不会填充,查询时也不会剔除空格。但是,如果TEXT被添加索引时,索引条目在会考虑填充或者剔除空格。如果含唯一键的TEXT,两个值只有结尾的空格数量不同,那么会包duplicate-key error。BLOB没有不适用;
BLOB 和TEXT列的索引必须限定长度;
BLOB和TEXT列不能有DEFAULT值;
BLOB和TEXT列最多使用max_sort_length(默认1024)字节进行排序;可以设置session级别的值;
含BLOB或TEXT列的临时表的处理,使用的是磁盘的表数据,而不是内存,因为MEMORY存储引擎不支持这些数据类型。
MEDIUMBLOB、MEDIUMTEXT
MEDIUMBLOB最大长度为16,777,215( 2 24 2^{24} 224-1)字节。每个MEDIUMBLOB值都使用一个3字节的长度前缀来存储,表明该值的字节数。
LONGBLOB、LONGTEXT
最大4GB,LONGBLOB列的有效最大长度取决于客户端/服务器协议中配置的最大数据包大小和可用内存。每个LONGBLOB值都使用一个4字节的长度前缀来存储,表示该值的字节数。
LONGTEXT 相似
ENUM(‘value1’,‘value2’,…) [CHARACTER SET charset_name] [COLLATE collation_name]
字符串对象,只能有一个值,ENUM值在内部被表示为整数。
一个ENUM列最多可以有65,535个不同的元素。
枚举值尽量不要用数字字符串,不然很容易与背后的数字表示混淆;
ENUM的排序是按照索引顺序,而不是字符串的顺序。比如enum(‘b’,‘a’), 'b’会排在’a’前面。索引从1开始,空字符的索引是0;
SET(‘value1’,‘value2’,…) [CHARACTER SET charset_name] [COLLATE collation_name]
一个字符串对象,可以有零个或多个值。SET值在内部表示为整数。
一个SET列最多可以有64个不同的元素。
可以使用FIND_IN_SET或LIKE来检索SET
注意事项
- 对于非二进制字符串(CHAR、VARCHAR和TEXT值),collation 的PAD属性决定了在比较中对字符串末尾的尾部空格的处理。NO PAD在比较中把尾部空格视为重要的,就像任何其他字符一样。PAD SPACE校对在比较中把尾部空格视为无关紧要的, 比较时不会考虑空格。