有道面试题:若一张表中只有一个字段VARCHAR(N)类型,utf8编码,则N最大值为多少?
先明白计算的一些规则限制面试
4.0版本如下,varchar(20),指的是20字节,若是存放UTF8汉字时,只能存6个(每一个汉字3字节)
5.0版本以上,varchar(20),指的是20字符,不管存放的是数字、字母仍是UTF8汉字(每一个汉字3字节),均可以存放20个,最大大小是65532字节 编码
① 存储限制
须要额外地在长度列表上存放实际的字符长度:小于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.net
则此处N的最大值为 (65535-1-2-4-30*3)/3=21812orm
减1和减2与上例相同;blog
减4的缘由是int类型的c占4个字节;get
减30*3的缘由是char(30)占用90个字节,编码是utf8。table
若是被varchar超过上述的b规则,被强转成text类型,则每一个字段占用定义长度为11字节,固然这已经不是“varchar”了form
出处:https://blog.csdn.net/u012048106/article/details/23173911tab