关于 MySQL 行格式的问题(《MySQL 是怎样运行的:从根上理解 MySQL》)

205 天前
 dcsuibian

书中第五章:从一条记录说起—— 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;

却是可以成功的。

这不就互相矛盾了么。

1193 次点击
所在节点    MySQL
7 条回复
Flourite
205 天前
?现在是 dynamic 格式
mightybruce
205 天前
看这种书一定不要相信所有,我看了没有贴出 mysql 版本和源码, 另外书里的大多数东西就能在 mysql 官网上方找到,只不过多数人不看。
wuyiccc
205 天前
第一位 1 也算啊
wuyiccc
205 天前
第一位为 0 就是范围 0 ~ 127 (0 ~ 2^7-1)
第一位为 1 就是范围 128 (2^7) ~ 2^32
dcsuibian
204 天前
[已解决]参考 https://cloud.tencent.com/developer/article/1811760

图: https://wexcdn.com/img/image-20231018132210882.png

其实书中也已经提到了:
对于一些占用字节数非常多的字段,比方说某个字段长度大于了 16KB ,那么如果该记录在单个页面中无法存储时,InnoDB 会把一部分数据存放到所谓的溢出页中(我们后边会唠叨),在变长字段长度列表处只存储留在本页面中的长度,所以使用两个字节也可以存放下来。

但是说的没图中那么详细,我也没注意到这点
msaionyc
204 天前
感谢楼主,之前看这块儿总感觉有点儿问题,现在明白了
wuyiccc
192 天前
@dcsuibian 强!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/982680

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX