MySQL之vachar

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_第1张图片
图片发自App

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


MySQL之vachar_第2张图片
图片发自App

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。

你可能感兴趣的:(MySQL之vachar)