在官方文件文件中,我读到了以下关于记录结构的内容
一条记录按该顺序包含一个标题和一个正文。标头以单个varint开始,该变量确定标头中的总字节数。Varint值是报头的字节大小,包括大小varint本身。在SIZE VARINT之后是一个或多个额外的VARINT,每列一个。这些额外的变量被称为“序列型”数字,它们决定了每列的数据类型。
为了更好地了解这一点,我创建了一个新数据库(SQLite版本3.22.0),并生成了以下表
sqlite> CREATE TABLE IF NOT EXISTS table_1(id INT NOT NULL, name TEXT NOT NULL);
sqlite> INSERT INTO table_1 VALUES (1, "Hello World");
我用十六进制编辑器打开了数据库文件。我的数据记录保存如下:
0E 01 03 09 23 48 65 6C 6C 6F 20 57 6F 72 6C 64
标题以标题大小开头。在本例中为14(0E)。在这个“在大小变量之后是一个或多个附加变量,每列一个变量”之后。这是非常令人困惑的。我有两列:ID和姓名。因此,我预计对应的序列类型代码有两个变量(请参阅链接):
1.1(1字节整数,用于存储值1)
1.23(表示11字节字符串:(0x23=35=>(35-13)/2=11))
我本以为会出现以下标题:
03 01 23
使用正文或数据段:
01 48 65 6C 6C 6F 20 57 6F 72 6C 64
为什么官方文献会有所不同?附加值意味着什么?为什么报头的长度被指定为14个字节?
1条答案
按热度按时间w1e3prcc1#
您正在查看的字节开头的
0E 01
来自b-tree叶单元标头(14字节的有效负载(记录),rowid 1),而不是记录本身。记录头实际上是
03 09 23
。三字节长,第一列值为1(不占用正文空间)和一个11字节的字符串。然后是记录体中的字符串数据。