变长字段长度列表
varchar 是变长的,变长字段实际存储的数据的长度(大小)是不固定的。所以存储数据的时候,也要把数据占用的大小存起来,变长字段的真实数据占用的字节数会按照列的顺序逆序存放到「变长字段长度列表」里面,读取数据的时候根据变长字段长度列表去读取对应长度的数据。其他 TEXT、BLOB 等变长字段也是相同的实现。
举例说明
说明下「变长字段长度列表」具体是怎么保存「变长字段的真实数据占用的字节数」。先创建这样一张user表,字符集是 ascii(每一个字符占用1 字节),行格式是 Compact,user表中 name 和 phone 字段都是变长字段:
三条记录如下:
第一条记录:
- name 列的值为 a,真实数据占用的字节数是 1 字节,十六进制 0x01;
- phone 列的值为 123,真实数据占用的字节数是 3 字节,十六进制 0x03;
- age 列和 id 列不是变长字段,不用管。
这些变长字段的真实数据占用的字节数会按照列的顺序逆序存放,所以「变长字段长度列表」里的内容是「 03 01」,而不是 「01 03」。
同道,第二条记录的行格式中,「变长字段长度列表」里的内容是「 04 02」
第三条记录中 phone 列的值是 NULL,NULL 是不会存放在行格式中记录的真实数据部分里的,所以「变长字段长度列表」里不需要保存值为 NULL 的变长字段的长度。