MySQL中varchar()的最大长度 char(255)最大长度

  •   
  • 10541
  • MySQL
  • 0
  • super_dodo
  • 2016/09/06

MySQL的vachar字段的类型虽然最大长度是65535,但是并不是能存这么多数据,最大可以到65533(不允许非空字段的时候),当允许非空字段的时候只能到65532。

varchar()最大可设置为 65532 / 3 = 21844 (utf8)

char()最大是255个字符,不论什么编码

英文和数字的话两种都是一个字母是1个字节.

就中文汉字来说,utf8占3个字节,gbk占2个字节。varchar(n),这里的n代表n个字符。

mysql表中字段总长度可以有65535个字节,意思就是 如果一个表只有varchar(n)这么一个字段,而且是utf8的话,那么这个字段最大可以有65535个字节的长度,差不多n=65535/3的字符。

为什么说差不多。因为varchar在存储的时候,会另加一个字节来记录长度(如果列声明的长度超过255字节,则使用两个字节,刚好2的8次方是255,超过255就只能用2个字节16位来记录了)。

如果表中有个char(10)和varchar(n)的话,那么就就这样,n的最大值 = 65532 / 3 = 21488 (2万多汉字)

有道面试题:若一张表中只有一个字段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=utf8mb4;
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了