5.0.3之前,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节),最大0-255个字节。
5.0.3之后,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个。
在建表时,当超过长度限制,MySql会报错,建议使用TEXT或者BLOB;而当INSERT数据时,如果VALUE超出VARCHAR声明时的长度,则会自动被截断。
varchar 字段是将实际内容单独存储在聚簇索引之外(这也是为什么不建议用字符串做主键的原因之一),内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),
另外,开头还有1个字节存放其它一些控制信息。
所以,一个表所有类型的列,大小加起来不能超过65532字节(不包括text、blob,2字节存储varchar长度,1字节存储其它信息)
a) 若一个表只有一个varchar类型,如定义为
create table t1(c varchar(N)) charset = gbk;
则此处N的最大值为(65535-1-2)/2= 32766。
减1的原因是实际行存储从第二个字节开始;
减2的原因是varchar头部的2个字节表示长度;
除2的原因是字符编码是gbk。
如下图:使用最大值32766时,正确创建。
MySQL之vachar
如果若使用32767,MySql则会报出异常,创建失败。
MySQL之vachar
b) 若一个表定义为
create table t2(i int, c char(30), ch varchar(N)) charset=utf8;
则此处N的最大值为 (65535 - 1 - 2 - 4 - 30 * 3)/3=21812
减1和减2与上例相同;
减4的原因是int类型的c占4个字节;
减30 * 3的原因是char(30)占用90个字节,编码是utf8。
网友评论