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:仅从其字节识别页面类型?的主要内容,如果未能解决你的问题,请参考以下文章