一.VARCHAR存储和行长度限制
1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是65535个字节,但并不支持65535长度的varchar,65535中应该包含了所有字段的长度、变长字段长度标示位、NULL标示位的累计。其中内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节)。所以还有别的开销,实际能存放的长度为65532.
(MySQL数据库的varchar类型在5.0.3以下的版本中的最大长度限制为255,其数据范围可以是0~255)
2.因为null标示位占用了一个字节,所以可以去掉not null限制。
3.MySQL要求一个行的定义长度不能超过65535 是指所有列的长度总和不能超过65535.如果列的长度总和超过这个长度,依然无法创建.
二.VARCHAR长度的编码限制
1.概述
字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;
字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。
若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。
2.举例
(1)若一个表只有一个varchar类型,如定义为
create table t4(c varchar(N)) charset=gbk;
则此处N的最大值为(65535-1-2)/2= 32766。
减1的原因是实际行存储从第二个字节开始’;
减2的原因是varchar头部的2个字节表示长度;
除2的原因是字符编码是gbk。
(2) 若一个表定义为
create table t4(c int, c2 char(30), c3 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。
如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,当然这已经不是“varchar”了。