SQLITE3记录格式与单据不同

ep6jt1vc  于 2022-11-15  发布在  SQLite
关注(0)|答案(1)|浏览(168)

在官方文件文件中,我读到了以下关于记录结构的内容
一条记录按该顺序包含一个标题和一个正文。标头以单个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个字节?

w1e3prcc

w1e3prcc1#

您正在查看的字节开头的0E 01来自b-tree叶单元标头(14字节的有效负载(记录),rowid 1),而不是记录本身。
记录头实际上是03 09 23。三字节长,第一列值为1(不占用正文空间)和一个11字节的字符串。然后是记录体中的字符串数据。

相关问题