5.0.3之前,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节),最大0-255个字节。
5.0.3之后,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节(这个表所有列加起来大小)
在建表时,当超过长度限制,MySql会报错,建议使用TEXT或者BLOB;而当INSERT数据时,如果VALUE超出VARCHAR声明时的长度,则会自动被截断。
varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),
另外,开头还有1个字节存放其它一些控制信息。
a) 若一个表只有一个varchar类型,如定义为
create table t1(c varchar(N)) charset = gbk;
则此处N的最大值为(65535-1-2)/2= 32766。
减1的原因是实际行存储从第二个字节开始;
减2的原因是varchar头部的2个字节表示长度;
除2的原因是字符编码是gbk。
如下图:使用最大值32766时,正确创建。

如果若使用32767,MySql则会报出异常,创建失败。

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。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28912557/viewspace-1191886/
,如需转载,请注明出处,否则将追究法律责任。