MySQL定义char和varchar类型,utf8编码,则最⼤值为多少?
有道⾯试题:若⼀张表中只有⼀个字段VARCHAR(N)类型,utf8编码,则N最⼤值为多少?
先明⽩计算的⼀些规则限制
4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)
5.0版本以上,varchar(20),指的是20字符,⽆论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最⼤⼤⼩是65532字节
①存储限制
varchar2最大长度需要额外地在长度列表上存放实际的字符长度:⼩于255为1个字节,⼤于255则要2个字节
②编码限制
gbk:每个字符最多占⽤2个字节
utf8:每个字符最多占⽤3个字节
③长度限制
MySQL定义⾏的长度不能超过65535,这个限制了列的数⽬,⽐如char(255) utf8
那么列的数⽬最多有65535/(255*3)=85,列的数⽬可以从这⾥得到依据
⾏长度计算公式如下:
row length = 1
+ (sum of column lengths)
+ (number of NULL columns + delete_flag + 7)/8
+ (number of variable-length columns)
①对于MyISAM,需要额外1个位来记录值是否为NULL;对于InnoDB,没有区别
②对于row_format为fixed,delete_flag为1;对于row_format=dynamic,delete_flag为0
根据这个公式,我们便能够解答开头N的最⼤值:(65535-1-2)/3
减1是因为实际存储从第2个字节开始
减2则因为要在列表长度存储实际字符长度
除3是因为utf8编码限制
再来⼀道:
create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;
N的最⼤值:(65535-1-2-4-30*3)/3
则此处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”了
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论