如何理解mysql中的这句话:each NULL column takes one bit extra

how to understand this sentence in mysql: each NULL column takes one bit extra

在mysql手册中:https://dev.mysql.com/doc/refman/5.6/en/column-count-limit.html上面有一个示例link,示例代码粘贴在下面。

手册说每个 NULL 列占用一位,四舍五入到最接近的字节。

我不明白,对于下面的例子,我认为2个空列占用2位并舍入到1个字节。 32765 + 32766 + 1 = 65532,但实际上 mysql 发生行大小超过 65535 的错误,我的想法有什么问题?请指出!

CREATE TABLE t3
(c1 VARCHAR(32765) NULL, c2 VARCHAR(32766) NULL)
ENGINE = MyISAM CHARACTER SET latin1;

结果:

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

希望有人能用简单的语法具体解释一下,我英语不好,非常感谢!

由于没有"column value"对应于NULL,MySQL使用额外的标志来指示该列是NULL。 (在这种情况下,"column value" 区域中的任何数据都将被忽略,因为 "they're not there.")

说真的,如果您 运行 达到行大小限制,您可能需要重新考虑 table(s) 的设计。 (是否有"repeating groups?"列名,如name_23, name_24 ...?)数据可以分成多个table。等等。架构限制应为 "plenty big enough."

https://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html#data-types-storage-reqs-strings

对于 (latin1) VARCHAR(L),所需的存储空间为 "L + 1 bytes if column values require 0 − 255 bytes, L + 2 bytes if values may require more than 255 bytes"。

因此,您的列每个长度需要 2 个额外字节,再加上 table 的空标志需要一个额外字节。即 32765+2+32766+2+1=65536