书中第五章:从一条记录说起—— InnoDB 记录结构
其中在InnoDB 行格式-->COMPACT 行格式-->记录的真实数据小节这里有以下内容:
InnoDB 在读记录的变长字段长度列表时先查看表结构,如果某个变长字段允许存储的最大字节数大于 255 时,该怎么区分它正在读的某个字节是一个单独的字段长度还是半个字段长度呢?设计 InnoDB 的大叔使用该字节的第一个二进制位作为标志位:如果该字节的第一个位为 0 ,那该字节就是一个单独的字段长度(使用一个字节表示不大于 127 的二进制的第一个位都为 0 ),如果该字节的第一个位为 1 ,那该字节就是半个字段长度。
如果需要 1 位来作为标志位,那么两个字节时剩 15 位可以用来表示长度了。也就是长度为 2^15-1=32767 。
但实际
CREATE TABLE varchar_size_demo(
c VARCHAR(65532)
) CHARSET=ascii ROW_FORMAT=Compact;
却是可以成功的。
这不就互相矛盾了么。
1
Flourite 2023-10-17 10:59:29 +08:00
?现在是 dynamic 格式
|
2
mightybruce 2023-10-17 11:24:04 +08:00
看这种书一定不要相信所有,我看了没有贴出 mysql 版本和源码, 另外书里的大多数东西就能在 mysql 官网上方找到,只不过多数人不看。
|
3
wuyiccc 2023-10-17 11:59:39 +08:00
第一位 1 也算啊
|
4
wuyiccc 2023-10-17 12:08:25 +08:00
第一位为 0 就是范围 0 ~ 127 (0 ~ 2^7-1)
第一位为 1 就是范围 128 (2^7) ~ 2^32 |
5
dcsuibian OP [已解决]参考 https://cloud.tencent.com/developer/article/1811760
图: https://wexcdn.com/img/image-20231018132210882.png 其实书中也已经提到了: 对于一些占用字节数非常多的字段,比方说某个字段长度大于了 16KB ,那么如果该记录在单个页面中无法存储时,InnoDB 会把一部分数据存放到所谓的溢出页中(我们后边会唠叨),在变长字段长度列表处只存储留在本页面中的长度,所以使用两个字节也可以存放下来。 但是说的没图中那么详细,我也没注意到这点 |
6
msaionyc 2023-10-18 17:22:44 +08:00
感谢楼主,之前看这块儿总感觉有点儿问题,现在明白了
|