字符串-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。
多字段计算
计算验证
- 变长字段长度列表占用字节数: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。