首页 > 数据库 > 数据库开发技术 > 字节一面:MySQL 是怎么存储 NULL 的?
MySQL 怎么存储,其实问的是 InnoDB 怎么存储,如果你清楚 InnoDB 存储引擎一行记录的格式,那么关于 NULL 值怎么存放这个问题,其实还是很简单的。本题已收录至 itmtx.cn,点击文末 阅读全文 可直达刷题网站:
InnoDB 中的所有数据都被逻辑地存放在一个空间中,这个空间被称之为 “表空间”(tablespace),表空间可以看作 InnoDB 存储引擎逻辑结构的最顶层,其中包含以下几个部分:
InnoDB 存储引擎提供了 Compact 和 Redundant 两种格式来存放行记录格式,MySQL 5.1 默认保存为 Compact 格式。
可以通过 show table status like 'table_name' 来查看当前表使用的行记录格式。
Redundant 是为了兼容 MySQL 5.0 之前的版本来存在的,这里就不详细说了,主要看 Compact 格式,如下所示:
首先,Compact 行格式的首部是一个非 NULL 变长字段(varchar)的长度列表,并且这个长度列表是按照列的顺序逆序放置的:
举个例子,比如有四个字段 (id, name, age, address),name 和 address 都是变长类型,有两行记录:
| id | name | age | address |
|---|---|---|---|
| 1 | Job | 20 | Los Angeles |
| 2 | Julia | 21 | Panama |
这两行记录对应的 Compact 格式如下图所示:
第二个部分就是 NULL 标识位,用于指示这行数据中是否有 NULL 值,若有的话,则将对应的比特位置为 1。具体来说,每个列对应一个二进制位(bit),二进制位同样按照列的顺序逆序排列。
比如有一行记录 id = 1, name = "admin", age = NULL,那么这行记录对应的 NULL 标位就是 100(逆序排放,[age, name, id]),然后在高位补 0,最终就是 0000 0100
第三部分是记录头信息(record header),固定占用 5 个字节(40 位),主要就是包含比如该行是否已被删除、页中下一条记录的相对位置等等之类的
往期推荐

关注我们
2023-05-06
2023-05-13
2023-05-10
2023-04-25
2023-05-03
分享大厂面试真题原创题解 & 成长经验.
刷题网站: itmtx.cn
原文作者:飞天小牛肉;如有侵权,请联系管理员删除。