(1)首先上面介绍了 可变字段长度列表 NULL值列表 头信息 具体值 ===> “jack NULL m NULL xx_school”
大致存储数据如此:0x09 0x04 00000101 0000000000000000000010000000000000011001 jack m xx_school
再次解释下:
在读取这个数据的时候,根据变长字段长度,先读取jack这个值,因为这个值长度是4,读取4个长度的数据,jack就读取出来了
然后发现第二个字段是NULL,就不用读取了,第三个是定长字段,直接读取1个字符,第四个是NULL,不用读取,第五个字段是变长字段长度是9,读取 xx_school。
但是真正在磁盘上存储的时候,字符串不是直接存储在磁盘上的。实际上字符串和其他类型是根据数据库指定的字符集编码,进行编码之后再存储的,所以大致看起来的一行数据如下:
0x09 0x04 00000101 0000000000000000000010000000000000011001 616161 636320 6262626262
字符串和其他类型的数值最终会根据字符集编码
(2)最最后,会在实际存储一行数据时,会在他的真实数据部分,加入一些隐藏字段:
首先是 DB_ROW_ID 字段,这是一行的唯一标识,是数据库内部给你的一个标识,不是你的主键ID字段。如果没有指定主键和unique key 唯一索引的时候,内部会自动加一个ROW_ID作为主键。
然后 DB_TRX_ID 字段,这是跟事务相关的,表示是哪个事务更新的数据,这是事务ID,
最后 DB_ROLL_PTR字段,这是回滚指针,是用来进行事务回滚的,
所以加上这几个隐藏字段之后,实际一行数据看起来如下所示:
0x09 0x04 00000101 0000000000000000000010000000000000011001 00000000094C<br />(DB_ROW_ID)00000000032D <br />(DB_TRX_ID) EA000010078E<br />(DB_ROL_PTR)616161 636320 <br /> 6262626262
变长字段列表 null值列表 数据头 ROW_ID TRX_ID ROL_ID 编码值信息
读数据怎么读的?首先定位到这个数据,定位是根据数据头里的next_record指针进行读取的,为什么变长字段长度列表和null值列表为什么是逆序存储的,因为挨着数据头的行指针方便顺序读取。