字符串-varchar(n)-n最大取值计算

总结

所有字段的字节数 + 变长字段长度列表所占用的字节数 + NULL值列表所占用的字节数 65535。

必要知识

MySQL 规定除了 TEXT、BLOB 这种大对象类型之外,其他所有的列(不包括隐藏列和记录头信息)占用的字节长度加起来不能超过 65535 个字节。也就是说一行数据的最大字节数是 65535(不包含 TEXT、BLOB 这种大对象类型),65535是包含「变长字段长度列表」和 「NULL 值列表」所占用的字节数的。所以, 我们在算 varchar(n) 中 n 最大值时,需要减去 storage overhead(就是「变长字段长度列表」和 「NULL 值列表」) 占用的字节数。

字符数量-不等同-字节大小

存储varchar所需字节

单字段计算

如果字段类型是 varchar(65535) ,字符集是 ascii。

  • 变长字段长度列表占用字节数:变长字段长度=2。只有 1 个变长字段,所以变长字段长度列表=2 字节。
  • NULL 值列表占用字节数:1个允许为空的字段,不满 8 个,占用额外的 1 字节
  • 真实数据占用字节数:65535 - 2 - 1 = 65532字节
  • 字符数n:字符集是 ascii,1 个字符占用 1 字节,n=65532,如果使用的是 UTF-8字符集下,1个字符最多需要3个字节,n=65532/3 = 21844。

多字段计算

CREATE TABLE `aa` (
  `id` varchar(5) NOT NULL,
  `name` varchar(16377) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

计算验证

  • 变长字段长度列表占用字节数:id字段变长字段长度=1,name字段变长字段长度=2,所以变长字段长度列表=3字节。
  • NULL 值列表占用字节数:2个允许为空的字段,不满 8 个,占用额外的 1 字节
  • 真实数据占用字节数:65535 - 2 - 1 - 1= 65531字节
  • 字符数(t):字符集是 utf8mb4,1 个字符占用 4 字节,t=65531/4 = 16382.75。
  • name字段最大字符数:id已经定义占用5个字符,所以name varchar(n)中n=16382.75-5=16377.75,n最大为16377。

参考

行格式-COMPACT详解