SQLite:仅从其字节识别页面类型?

Posted

技术标签:

【中文标题】SQLite:仅从其字节识别页面类型?【英文标题】:SQLite: identify page type just from its bytes? 【发布时间】:2021-09-26 15:06:00 【问题描述】:

从https://www.sqlite.org/fileformat.html看来,SQLite 数据库中有 9 种类型的页面:

锁字节页面 freelist 主干页面 freelist 叶页面 一个表 b-tree 内页 A 表 b-tree 叶页 索引 b-tree 内部页面 索引 b-tree 叶页 有效负载溢出页面 指针映射页面

仅给定单个页面的字节,是否可以识别其类型?

我实际上倾向于,这是不可能的。例如因为对于溢出页面

每个溢出页的前四个字节是一个大端整数,它是链中下一页的页码

这意味着某些溢出页面根据其第一个字节可能看起来像一个 b-tree 页面:

偏移量 0 处的一字节标志,指示 b-tree 页面类型。

值为 2 (0x02) 表示该页面是内部索引 b 树页面。 值为 5 (0x05) 表示该页面是内部表 b-tree 页面。 值为 10 (0x0a) 表示该页面是叶索引 b 树页面。 值为 13 (0x0d) 表示该页面是叶表 b 树页面。

但是...我希望我忽略了一些东西。 (例如,是否可以查看除第一个以外的某些字节来确定类型?)

【问题讨论】:

我想你已经回答了你自己的问题。 @user965972 我稍微编辑了这个问题,希望表明我还没有完全回答这个问题。我知道了。但是,如果你不问... 【参考方案1】:

根据我目前对文件格式的了解,我认为这不可能。我的推理:

    只有在前 13 页不是摘要中的溢出页时才有可能。

    如果数据超过叶页上嵌入的有效负载限制,则使用溢出页。

    最小的表只是一个叶子页作为它的根页。

    最小的叶页是单行。

    第1页用于表头和主表。

因此,最小的数据库有一个主表(第 1 页),在其唯一的表中只有一行(第 2 页)。从一行溢出最大有效负载部分的那一刻起,就会创建一个溢出页面。那将是第 3 页。

【讨论】:

以上是关于SQLite:仅从其字节识别页面类型?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone/Sqlite - 如何仅从服务器获取更改的数据?

SQLite教程04-SQLite数据类型

SQLite 中是不是有 Long 类型?

Android SQLite使用

SQLite 学习

SQLite教程(内置日期和时间函数)