sqlite 数据库官方文档(翻译版)

此文档介绍并定义所使用的*数据库文件格式SQLite.

10 数据库文件

在大多数情况下.完整的状态SQLite 数据库数据库中包含一个名为"main 单一文件在磁盘上文件"

在执行事务, 默认行为是存储一些临时信息在第二个名为"rollback 日记"( 当使用替代方法是windows mobile 设备中心-或是用户输入了主机计算机)如果应用程序或崩溃日志回滚, 然后在正在完成事务包含所需紧急状态信息还原该主数据库文件的内容当显示主机的报警子集状态所需的一个回滚日记中包含的信息该数据库的快照, 我们认为它是一个"hot 日记账"热过账日记账时仅碰到一个错误恢复过程方案并会放慢, 但它们的一部分的状态一个SQLite 数据库, 因此不应忽略此文档定义的格式回滚日志(和windows mobile 设备中心file) , 但是主要焦点在主数据库文件

11 页

主数据库文件由一个或更多页一页的大小的百分比512 和65536 的幂在同一数据库相同内所有网页大小为数据库文件是由2字节整数位于偏移16 字节从数据库文件

页1开始计数.页码的最大值是2147483646 (231 -2)数据库中的最小大小SQLite 为单个512-byte 页允许的最大大小数据库2147483646 在65536 字节每页行数或140, 737, 488, 224, 256 字节(140 terabytes) 有关的信息通常SQLite 会达到最大文件大小限制基础文件系统或磁盘硬件大小限制long 类型.在它未命中的总数自己的内部大小限制

在"使用, SQLite 数据库往往范围大小从千字节到几数gb

在每一页的任意时刻, main 数据库只有一个单一的使用的是以下值中的一个:

  • lock-byte 页
  • 一个freelist 页
    • 一个freelist trunk 页
    • 一个freelist 叶页
  • 视图定义页
    • 表视图定义的内部页
    • 表叶页
    • 索引id1 的内部页
    • 索引叶页
  • 一个负载溢出页
  • 一个指针, map 页

所有的读取和写入到这些主数据库文件以在一个页面边界之间的整数, 所有写入被中页面的大小还可以读取通常是一个整数中页面的大小使用一个异常的类型时数据库中首次打开前100 个字节的数据库文件(数据库文件头)都是只读作为一个sub-page 大小

任何information-bearing 页底部的数据库的修改前, 则原始不被修改该页的内容都会写入日志回滚如果一个事务被中断, 您需要将回滚, 则回滚连接, 将数据库恢复到原来的状态熊freelist 叶填满信息, 这些需要在一个回滚且还原之前这样, 它们就不会被写入日志中这种修改为了减少磁盘I/O

12 数据库头

前100 个字节的数据库文件举例说明了数据库文件表头数据库文件头下面的被划分为字段作为表在数据库文件头多字节所有字段都将存储, 必须公司名称(big-endian)

数据库标题格式
偏移 大小 说明
0 16 字符串头: "SQLite 格式300 "
16 2 数据库页大小以字节必须作为两个512 和32768 之间的integer 类型.代表纸张大小为65536 的值1
18 1 写入版本的文件格式传统;2的1WAL .
19 1 读取版本的文件格式传统;2的1WAL .
20 1 字节的未使用的"reserved "空间末尾的每个页面通常0
21 1 负载时的最多数量的分数必须64
22 1 最小嵌入式负载时的分数必须是32
23 1 叶负载时的分数必须是32
24 4 文件更改计数器.
28 4 pages 中的数据库文件大小的更改"in-header数据库大小"
32 4 如果页面的第一个freelist trunk
使用键盘和鼠标创建和编辑公式"第36 4 freelist 页的总数
40 4 该架构cookie .
44 4 该架构格式数支持的架构格式是1, 2, 3, 4
48 4 缓存大小默认网页
52 4 根最大的页号为视图定义页auto-vacuum 或incremental-vacuum 模式, 或零中时, 否则.
56 4 数据库文本文件组值1表示UTF-8值为2意味着UTF-16le值为3表示UTF-16be
60 4 代理以读/写和"user 版本"user_version 大全 .
64 4 为incremental-vacuum true (非零)模式为false (0)否则
68 24 保留的扩展必须为零
92 4 "version-valid-for 编号.
96 4 SQLITE_VERSION_NUMBER

121 magic 头字符串

所有有效的SQLite 数据库文件始于以下16 个字节(在hex) : 53 51 4c 69 74 65 20 66 递减顺序72 6d 61 74 20 33 00此"SQLite 格式的字节序列对应于UTF-8 字符串3"包括nul 终结器中的字符结束

122 页大小

在two-byte 16 偏移位置处开始的值将决定该页大小SQLite版本3701 及更早的版本, 此值为每一行都被当作大端字节整数和指定的两个512 和32768 之间的百分比数字SQLite开始版本371 , 纸张大小为65536 字节是受支持的在two-byte 65536 的值不能为空, 因此指定一个65536-byte 页面大小、0x00 0x01 是在偏移位置16 个的值此值可以解释为大端字节和1用户架构看作是作为一个magic number 表示65536 页面大小或一个作为低位字节在前就可以查看two-byte 字段编号, 并说它代表页面尺寸除以256这两个interpretations 字段是page-size 是等效的

123 文件版本编号格式

写入版本的文件格式和文件格式读取版本的偏移18 19 , 对于在增强功能在SQLite 的保存的文件格式在当前的SQLite, 这两个版本回滚journalling 模式的值是1, 2WAL journalling 模式如果某一版本的SQLite 编码来当前的文件格式指定遇到一个数据库读取的文件版本是1或2但写入版本大于2数据库文件必须被视为只读如果数据库文件时遇到的一个大于2是读取版本, 然后该数据库中不能读取或写入

12每页4保留图像字节

SQLite 已在"使用样板"少数几个额外字节末尾的每一个页面使用它们来扩展是否使用这些额外字节, 例如, SQLite 加密扩展插件可保存一个nonce and/or 加密与每个页面相关联的校验和"reserved空间"在偏移位置处1字节带符号整型21 群的字节数的空间末尾的每个页面来预留的扩展该值是通常0该值可以奇数

要在数据库页的""usable , 页面文件大小指定2字节整数偏移量16 在标题, 当"reserved "空间的大小1字节带符号整型中记录的偏移量20 中的标题可用大小为一个网页也可能是一个使费解但是, 可以使用大小是不允许的少于480换句话说, 如果纸张大小为512 .然后保留的空间的大小不能超过32

125 负载时的分数

最大和最小值的嵌入式负载分数与叶负载分数值必须32 、和32这些值为方面, 为可调试参数无法识别用来修改该视图定义的存储格式的算法但是, 不支持该功能并没有当前规划添加在将来的支持因此, 这三个字节的固定在指定的值

126 文件更改计数器

更改计数器该文件时就是一个4字节big-endian 整数, 它就会增加1数据库被解锁后拥有被修改当两个或更多的进程阅读数据库文件, 每个进程可以检测到数据库更改与其它进程通过监视修改计数器一个进程后, 通常要刷新其数据库页面缓存将另一个进程修改了数据库, 缓存后已成为过时该文件更改的计数器转接器

在WAL 模式下, 对数据库的更改将检测到使用了wal-index , 所以不需要更改计数器因此, 要在每个事务中的更改可能会导致计数器递增WAL 模式

127 in-header 数据库大小

4字节大端字节整数偏移28 插入页眉将数据库文件大小的更改存储在页面中如果此in-header datasize 大小(请参见下一个paragraph) 无效, 然后数据库的大小是通过查看所计算的实际数据库文件大小的更改旧版本的SQLite 已忽略该in-header 实际使用的数据库的大小和文件大小以独占方式较新版本的SQLite 使用该in-header 数据库大小如果可用, 但回退到实际文件大小如果in-header 数据库大小无效

in-header 数据库的大小只有看作是有效的如果是零, 并在4字节更改计数器在偏移位置完全匹配24 4字节version-valid-for 编号在偏移位置92in-header 数据库的大小时始终有效该数据库是只读.使用目标SQLite (3或更高版本70和later)如果创建传统的SQLite 版本将写入数据库, 它不会知道要更新in-header 数据库的大小和in-header 数据库大小可能不正确但旧式版本的SQLite 这样也会保留在偏移位置的version-valid-for 编号92 , 以便它将不会匹配change-counter因此, 无法检测无效的in-header 数据库的大小(change-counter 和被忽略)的clean "当返回到version-valid-for 不匹配

12可用页列表8

未使用的页面在数据库文件存储在freelist4 字节大端字节整数32 在服务器存储从第一页的页号为freelist , 或为零如果freelist 为空4字节的偏移位置处大端字节整数36 存储在freelist 存储图片

129 架构cookie

该架构cookie 为4字节大端字节整数偏移量40 时.就会增加1该数据库模式更改一个prepared 语句是针对特定版本的数据库模式只要数据库模式更改, 在语句必须是reprepared每当一个prepared 语句上运行架构cookie 它首先检查以确保该值是相同语句用来准备和架构时, 将cookie 已更改该语句中止为了强制该语句为reprepared

1210 schema 格式的数字

该架构格式数为4字节大端字节整数偏移量44此文件格式的schema 格式数字类似于读和写偏移18 19 版本号除了schema 格式数字引用高级SQL 格式而不是低级视图定义格式4个架构设置数字是当前定义的:

  1. 1, 可以被所有的SQLite 回版本300
  2. 格式2将同一表中的行的能力具有可变数目的列, 为了支持ALTER TABLE ...ADD COLUMN 功能阅读和编写格式支持SQLite 版本3中新增21在2005-02-19 3
  3. 格式3添加了能力通过添加额外的列ALTER TABLE ...ADD COLUMN 若要让non-NULL 默认值该功能已在SQLite 版本31在2005-03-11 4
  4. 格式4导致SQLite 尊重上的DESC 关键字索引声明(将忽略DESC 关键字中没有为格式1、2和34 的格式.)添加两个新的boolean 类型值(记录串行类型8和9SQLite 中新增)支持格式433在2006-01-10 0

新的数据库SQLite 使用所创建的文件格式1默认情况下, 因此该数据库中所创建的文件较新版本的SQLite 仍可由旧版本的SQLite 读取"legacy_file_format 大全 可以用于将导致SQLite 使用格式创建新数据库文件4以后的SQLite 可能会开始创建缺省情况下4文件使用格式

1211 建议的缓存大小

4字节的偏移量大端字节有符号整数48 是拼写建议.在页中的数据库文件缓存的大小该值是一个建议只和SQLite 下没有家长接受它accelerator属性的整数被用作合适的软件包建议根据使用缓存的大小default_cache_size 大全 .

1212 增量真空设置

在两个4字节大端字节整数的第二页52 和64 是用于管理auto_vacuum 和incremental_vacuum 模式如果在偏移位置的整数52 不为零.pointer-map (ptrmap )页有从数据库中省略文件和既auto_vacuum 也支持incremental_vacuum如果integer 偏移量52 为非零然后它是"最大的root 页在数据库文件数据库文件包含ptrmap 页显示模式必须是auto_vacuum 或incremental_vacuum在此整数定义类, 偏移量为64 为true 为incremental_vacuum 和auto_vacuum 为false如果在偏移位置的整数52 不为零.还必须在偏移位置的整数64 零

1213 .

4字节大端字节整数的偏移量56 确定要使用的编码处的字符串存储在数据库中的所有文字值1表示UTF-8值为2意味着UTF-16le值为3表示UTF-16be没有其他允许的值

1214 用户版本号

4字节大端字节整数偏移量60 是用户版本该错误的原因可能是设置和查询的user_version 大全 使用的用户就是SQLite

1215 写库版本号和version-valid-for 数

4字节大端字节整数96 存储在服务器SQLITE_VERSION_NUMBER SQLite 库, 它最近一次修改的值数据库文件4字节big-ending 整数偏移量92 的值更改计数器当存储的版本号92个事务的偏移位置处整数版本号是有效的, 可以返回到"version-valid-for 和有时称为"

1216 头保留的空间中为扩展

文件标头的数据库的所有其他个字节是保留以供将来拓展必须设置为零

13 Lock-Byte 页

页面在对页面进行lock-byte 字节的数据库文件, 包含在1073741824 之间的偏移和1073742335 , 非独占一个小于或等于数据库文件时1073741824 字节中没有包含lock-byte 页命名文件大于1073741824 精确包含一个lock-byte 页面

页面在"使用样板"lock-byte 操作系统使用的特定VFS 在包中实现数据库实现文件锁定图元SQLite不能使用lock-byte 页SQLite核心将永远不会读取或写入, 虽然操作系统特定的VFS 实现可能在lock-byte 页中读取或写入字节根据需求和proclivities 的基础系统unix和win32 VFS 实现了内置到SQLite 不写入lock-byte 页面中, 但是第三方VFS 实现对其他操作系统可能无效.

14 的freelist

命名文件可以包含一个或多个页面将会在active未使用的页面可关于, 例如, 当从数据库中删除详细信息未使用的页面时, 会重新使用存储在freelist 并附加网页是必需的

指定freelist 的组织方式的每个trunk 页面的网页的freelist trunk 列表为零个或多个freelist 叶页的详细内容.请单击.

一个freelist trunk 页面包含的4字节大端字节整数的数组任意整数数组的大小将在新建对话框中可用的空间的页面所允许的最小可用空间480 字节数组.将始终被中至少有120 条目长度在页面的数组为number 的第一个整数的下一个freelist trunk 在列表或零个页如果这是域中最后freelist trunk 页在数组的第二个整数只有sysadmin 角色的成员才能遵循的指针, 调用第二个整数l如果l大于零的整数数组索引介于2和l+1 包容包含freelist 叶页的页码

freelist 叶不包含详细信息的页面SQLite避免读取或者写入freelist 叶页面的顺序来减少磁盘I/O

SQLite 中的bug 3或更高版本60将数据库改了损坏的数据如果任何页数组最后一个6freelist trunk 中的条目包含非零值此较新版本的SQLite 没有问题然而较新版本的SQLite 仍然避免使用页数组最后一个六个freelist trunk 中的条目在该数据库中所创建的文件较新版本的SQLite SQLite 更早版本可以读取.

freelist 数为4字节大端字节整数存储在数据库标题从最开始处的偏移36 文件数据库标题也可在页的第一个freelist trunk 网页作为一个4字节大端字节整数从最开始处的偏移32 文件

15 视图定义页

一个视图定义网页是一个内部页或非叶只有sysadmin 角色的成员才能包含键如果在一个表视图定义每个键具有关联的内容内部页面中包含k键没有内容, 但带有k+1 子级的指针, 视图定义页一个在内部视图定义页"pointer "就是31-bit 整数页码的子页

定义非叶深度的视图定义是1和所有内部视图定义是一种深度超过了它的任何子级的最大深度在customerinfo 数据库中, 所有子级中的任何一个内部视图定义具有相同的深度

在内部视图定义page 、指针和键逻辑上备用的指针在两端(上一句的概念上, 未完成-实际键和布局的更改将页面更加复杂和指针都不会在sequel 页面, 如图)同一页面中的所有项都是唯一的和逻辑上按降序顺序组织从左到右(同样, 逻辑, 而不是物理页面在任意实际内的位置的密钥)对于任何键x, 指针左边的x引用id1 的网页时所有的首选项小于或等于x指针x引用不同的网页, 在右边的所有按键都大于x

在页面上的一个内部id1 , 每个键和指针为其left 组合为一个称为"cell 结构"竖直方向)指针是一种灵活的单独购买非叶视图定义页面没有指针, 但它仍使用其他单元格的结构保持项的索引b-trees 或键值为表b-trees 和内容

每个视图定义页都有至少有一个父视图定义页一个没有父称为根视图定义页页根视图定义页另一页上的强制关闭其子级形成一个完整的视图定义有可能(并在常见)使单个页面组成的一个完整的视图定义中的非叶和根由于这台计算机的指针从家长的每一页上children , 可以定位一个完整的视图定义如果只有根网页是已知的因此, b-trees 通过根页码

叶级是表视图定义页或b树页的索引视图定义页每个视图定义完成内的所有网页是相同类型: 表或索引从表有一对一映射b-trees 在数据库文件添加到数据库中的(非虚)表模式, 包括系统表如sqlite_master在数据库中存在一对一的映射索引b-trees 隐含的索引在架构文件及索引, 包括创建唯一性约束与sqlite_master 表总是有其相应的id1 上的根页中页号为1sqlite_master 表包含其他表和索引根页码.可在数据库文件

在表中的每一项都视图定义由一个64 位有符号整数的键和到2147483647 个字节的任意数据内部表格b-trees 只有键和指针的子项所有的数据在表中包含的视图定义

每个条目在索引中视图定义由任意密钥长度到2147483647 个字节的, 并且没有数据

定义要使用的"payload "的单元格的单元格的任意长度部分视图定义的索引, 密钥将总是在长度和任意因此有效负载是键没有在单元格元素中的任意长度内部视图定义页和因此, 这些单元格.没有有效负载的表视图定义叶页包含任意长度的表的内容和因此, 对于单元格中的这些页面在有效负载是内容

当为单元格负载时的大小超过了某个阈值(..."定义更高版本)的前几个字节对负载存储在视图定义页面和余额都存储在链接的列表的内容溢出页面

一个视图定义页面划分为面域按下列顺序:

  1. 数据库文件头100-byte (仅限页1)
  2. 使用8或12 字节视图定义页标题
  3. 指针数组的单元格.
  4. 一元负数
  5. 内容区域的单元格.
  6. 所有地区

数据库文件文件头为找到100-byte 只能在1页, 它总是表格视图定义中所有其他数据库文件省略此页的视图定义100-byte 头

"属性"保留的区域中不用的空间末尾的每个页面(除"锁定"页面), 扩展可以用来保持per-page 详细信息保留的区域的大小是由one-byte 找到无符号整数在偏移20 安装到数据库中文件表头保留的区域的大小(通常为零

页脚视图定义为8字节的叶页和12 个字节用于内部页面所有多字节的值请在页眉大端字节页脚视图定义由以下字段:

视图定义页眉格式
偏移 大小 说明
0 1 一个表示视图定义标志值2表示该页面是内部索引视图定义页值为5表示该页是一个内部表视图定义页一个值为10 表明该页为叶索引视图定义页一个值为13 表明该页为叶表视图定义页其他任何值为id1 页类型是一个错误
1 2 字节偏移量至页面的第一个freeblock
3 2 该页上的单元格的个数
5 2 内容区域的单元格要变换的第一个字节一个零值为用来表示一个偏移位置, 16.7m 发生在空的根元素, 包含在页面当您使用65536-byte
7 1 在单元格中数字的wins 释放字节内容区域
8 4 该竖直方向)指针(仅限内部视图定义页)

视图定义页面中的单元格指针数组的紧跟在该视图定义页标题让known _y'' s是在b树的单元格数目此单元格指针数组由k2字节整数偏移的工作内容在键顺序排列的指针是随单元格右边的单元格("最小的单元格条目)名字和竖直方向)单元格(最大的密钥)最后的单元格.

单元格中的内容存储在单元格中的内容区域的视图定义页SQLite都力求来引用单元格为远id1 , 因为它可为下列的末尾, 为了保留空间, 以备将来的单元格指针数组该区域中的最后一个单元格.指针数组项之间的结尾的第一个单元格是未分配地区

如果页中没有包含单元格中的每一个根(这是我为一个表, 该表包含没有行)然后内容区域的偏移量单元格将等于该页大小减去字节的reserved space如果该数据库使用65536-byte 页面尺寸和reserved space 为零(.那么将保留空间)然后将计算内容的偏移为一个空页想要65536但是, 该整数太大, 不能存储在2字节不带符号整型, 因此值为0是子资源定位器

freeblock 是一种用于标识一个视图定义页面中的未分配空间内结构freeblocks链也不会将收件人添加到任何邮件列表2个字节一个freeblock 是一种大端字节整数, 它是在视图定义中的证书链中的下一个freeblock如果freeblock 或零是在最后一个链第三个和第四个字节的每个freeblock 表单大端字节整数, 它是freeblock 的大小以字节为单位, 包括4字节头freeblocks不会总是连接不断增加的偏移页脚第二个字段的视图定义是freeblock 数组的大小, 或零.如果没有freeblocks 在页面上在customerinfo 视图定义"页上, 将一个第一个freeblock 之前始终将至少有一个单元

freeblock 至少需要4字节的空间如果在组的末尾有一个单独的组1、2或3在单元格中未使用的字节内容区域, 那些字节包含片段将显示所有碎片的总数存储在第五个字段的视图定义页标题在css 视图定义页面上, 碎片的总数字节可能不要超过60

总的可用空间量视图定义页面包含未指派区域的大小的所有freeblocks 加上数目的总大小零碎免费的字节SQLite可能从reorganize 发现了一个视图定义字节页, 这样没有freeblocks 或片段所有未使用的字节都包含在未指派空间区域和所有单元格是紧实的紧密地必须在网页结尾这被称为"defragmenting "视图定义页面

长度可变的整数或"varint "是一种静态的64 位twos-complement 整数的huffman 编码, 使用较少的空间for small 正值一个varint 介于1和9个字节在varint 由零个或多个字节它们具有2010 集后跟一个字节使用2010 清除或9个字节这个短在每第一个8个八位字节和所有第九个字节8位为用于重新构建的64 位twos-complement 整数varints都从较早的big-endian : 字节的varint 就是多个并位由更高版本字节

单元格的格式取决于单元的哪些类型的视图定义页上会出现下表显示了在单元格的元素, 在各种id1 的出现顺序, 网页类型


表B-Tree 叶单元:

  • varint 这是总数的有效负荷, 包括任何溢出
  • 一个varint key , 一个整数k一个"rowid"
  • 在"有效负载不可舍出的页溢出
  • 4字节的大端字节整数页面的第一页上溢网页列表-如果是否适合所有有效负载视图定义页.

表B-Tree interior 属性:

  • 一个4字节big-ending 页码指定左边的指针.
  • varint 这是整数的键

索引B-Tree 叶单元:

  • 一个varint key 负载时的字节的总数, 包括任何溢出
  • 在"有效负载不可舍出的页溢出
  • 4字节的大端字节整数页面的第一页上溢网页列表-如果是否适合所有有效负载视图定义页.

索引B-Tree 内部单元格中:

  • 一个4字节big-ending 页码指定左边的指针.
  • 一个varint key 负载时的字节的总数, 包括任何溢出
  • 在"有效负载不可舍出的页溢出
  • 4字节的大端字节整数页面的第一页上溢网页列表-如果是否适合所有有效负载视图定义页.

上面的信息可以recast 到一个表格式如下所示:

视图定义单元格格式
数据类型 出现在...... 说明
表叶 表内部 索引叶 索引内部
4字节整数     页面左数
varint   有效负荷的字节数.
varint     未对id
字节数组   有效负荷
4字节整数   第一个溢出页的页码

有效负荷, 分析数据量到绘图页上溢出页也取决于multiline 的类型支持以下计算, 让我们u可用大小为一个数据库"页上, 单击"大小", 当reserved space 每个页面的结束然后让p是负载时的大小

表B-Tree 叶单元:

如果p小于负载时的大小或等于u-35 整个有效负载是存储在叶页让m是((u-12)*32/255)-23如果p大于u-35 然后字节的数量存储在视图定义只有sysadmin 角色的成员才能是较小的M+((P-M)%(U-4)) 和u-35注意, 存储在字节数只有sysadmin 角色的成员才能永远不会小于m

表B-Tree interior 属性:

表b-trees 内部页面的人没有有效负荷和因此永远不会是任何有效负载.

索引B-Tree 叶或内部单元格中:

让x是((u-12)*64/255)-23)如果负载时的大小p是小于或等于x整个有效负载是存储在视图定义页让m是((u-12)*32/255)-23如果p大于x然后字节的数量存储在视图定义页中较小的M+((P-M)%(U-4)) 和x注意, 索引页面上的存储过程的字节数量永远不会小于m

%a阈值被设计的最小扇出是4的索引b-trees 并以确保有足够的有效负载是在视图定义记录头状态通常可而无需咨询页面上的一个溢出在hindsight , SQLite 视图定义设计器的逻辑认识到这些阈值可能已经更改随常规对象但是, 在计算不能生成一个不兼容的情况下更改文件格式当前计算和然而, 即使它们是很复杂

16 芯负载溢出页

当负载的一个视图定义单元格为视图定义太大页, 该surplus 是spilled 拖溢出页溢出表单的页面链接的列表每个溢出页的第一个四个字节是一个大端字节整数, 它是证书链中的页码的下一页证书链中的最终的页或零第五条字节通过最后的适用性字节是使用溢出内容

17 指针映射或ptrmap 页

指针地图上或ptrmap 页面的是空白页面插入到数据库中要使操作auto_vacuum 和incremental_vacuum 在"导航"模式更有效在数据库中其他网页类型通常具有指针从父与子表例如, 内部视图定义页面中包含其子id1 指向网页和溢出某一个指针字段中设置证书链中的链接一个ptrmap 页面中包含链接信息在相对方向上, 从子父

在任何数据库必须存在ptrmap 页文件这有意义的根视图定义页值在偏移位置52 在数据库标题如果值为零, 则最大的根视图定义页.该数据库包含的ptrmap 页

在数据库包含ptrmap 页, 第一个ptrmap 页是第2页ptrmap页的5-byte 项目数组组成让j的5-byte 条目将在新建对话框中可用的空间的页面(换句话说, J=U/5第一个ptrmap 页面)将会包含_pages 的信息通过j+2 , 包括2和3第二个指针地图j+3 页的页将被和ptrmap 页面会提供信息的页面j+4 _通过2*j+3 非独占为整个数据库文件等等

在使用ptrmap 数据库中页所有网页在上一段的计算标识的位置处必须ptrmap 页, 并不需要任何其他页.可能是ptrmap 页面除如果byte-lock 页在outlook 中所发生的情况相同的页码作为ptrmap 页那么ptrmap 是移动至以下页面的一个case

在ptrmap 页面提供了每个5-byte 条目back-link 有关一个紧跟在指针的映射如果网页b是一个ptrmap 页然后back-link 关于页面b+1 是由指针上的第一个条目映射有关页面上b+2 是由第二项等等

每个5-byte ptrmap 条目由一个字节"page 类型"信息后跟一个4字节big-endian 页码五个识别网页类型:

  1. 一个根页该值应为零
  2. 一个freelist 页该值应为零
  3. 一个单元格负载第一页的溢出链该值已超出该视图定义包含该单元格的内容页面溢出
  4. 发生溢出链中的页行或列的第一个页该值已溢出先前的页的链
  5. 非root 用户视图定义页该值已父视图定义页

在任何数据库文件包含ptrmap 页面, 所有任何可归纳元素必须出现在根视图定义页, 单元格有效负载溢出页面上, 或freelist该限制可以确保根期间都不会移动页面auto-vacuum 或incremental-vacuumauto-vacuum 逻辑不能知道如何更新sqlite_master root_page 字段的表和它是必需的, 以防止根页在移动过程中另一个auto-vacuum , 以保持数据的完整性sqlite_master 表根页面移动到起始的数据库文件由CREATE TABLE, CREATE INDEX, DROP TABLE, 和DROP INDEX 操作

20 架构图层

低方面的foregoing 文字描述了SQLite 文件格式视图定义机制提供了一个强大而有效的方法访问大型数据集本节将描述了如何低级视图定义层就是用于实现较高级别的SQL 功能

21 记录格式

一个表视图定义叶页的内容和任何的键索引视图定义页的输出条件作为任意序列先前提到的讨论一个小于另一个基元类型, 但没有定义什么"less 比"快速将地址这些只是在当前分区

有效负荷, 或者是表格内容或索引键, 不总是在"record 格式"对应的记录格式定义值序列的一个表或索引中的列记录格式指定数目的列, 则每个数据类型的列, 每个列的内容

记录格式提供的使用长度可变的整数或varint 表示的64 位有符号定义上面的整数.

记录包含一个标题和正文, 顺序这是要被用单个varint 头, 它确定头中的字节的总数varint值被头的大小以字节为单位包括的大小varint 本身如下varint 大小的一个或多个附加varints , 一个列这些附加"serial 被调用的varints 类型"数字和确定该数据类型的表中的每一列, 遵循下面的图表:

串行类型代码的记录格式
串行类型 目录大小 含义
0 0 NULL
1 1 8位twos-complement 整数
2 2 大端字节16 位twos-complement 整数
3 3 big-endian 24 位twos-complement 整数
4 4 big-endian 32 位twos-complement 整数
5 6 big-endian 正向twos-complement 整数
6 8 big-endian 64 位twos-complement 整数
7 8 big-endian IEEE 数字754-2008 64 位浮点数
8 0 整数常数0只适用于schema 格式4和更高版本
9 0 整数常量1只适用于schema 格式4和更高版本
10, 11   未使用保留的扩展
n≥12和偶数页 (n-12)/2 一个长度为(n-12)/2 字节在BLOB
n≥13和奇数 (n-13)/2 在数据库中一个字符串编码和长度(n-13)/2 个字节如果省略nul 的终止符

注意, 因为的varints 定义, 页眉的大小varint 和串行类型varints 通常包括一个字节串行类型对于大型字符串和BLOBs varints , 可能会扩展两个或三个字节varints , 但也可以是异常而不是规则varint格式是在编码是非常高效的记录头

每一列的值在记录紧跟在页眉请注意, 对于串行类型0, 8、9、12 、13 .则该值为零个字节如果对这种类型的所有列都记录的正文部分为空

22 记录的排序次序

键在索引视图定义的顺序是由排序顺序记录的键表示记录按列比较两个列从左至右列的记录都被检查对列都将次序确定的相对顺序两个记录排序顺序是单独的列如下所示:

  1. NULL 值(串口)排序类型"0"
  2. 数值(串口类型1至9)next 并按照数字顺序进行排序
  3. 文本值(甚至串行12 和更大的)排序的顺序由列比较函数
  4. BLOB 值(奇数串行类型13 和更大的)确定memcmp() 顺序最后进行排序.

一个比较函数对于每一个列是必要的计算中的文本.SQLite 定义三种内置的比较功能:

BINARY 字符串是逐字节比较使用memcmp( )函数从标准c库失败
NOCASE 类似BINARY 只不过大写ASCII 字符(''a 通过''z '' '' )将页它们的小写形式相当于运行就是这样的比较注意只有ASCII 字符都case-foldedNOCASE 不实现一个通用unicode caseless 比较
RTRIM 像BINARY 除了空格的字符串是要比较之前, 请先elided

其他特定于应用程序的比较函数可以添加到SQLite 使用sqlite3_create_collation( )接口.

默认的比较函数的所有字符串是BINARY可选中指定的比较顺序的函数表的列可以是CREATE TABLE 使用COLLATE 子句的语句列定义仅当使用了列的索引是, 在执行比较函数中指定的CREATE TABLE 语句用于该列中的索引.默认情况下.虽然此可重写的使用COLLATE 子句的select 语句中CREATE INDEX 语句.

2SQL 表3表示形式

架构中的每个普通SQL 表在数据库中支持事务磁盘上的表视图定义在表中的每一项都视图定义对应于SQL 表中的某一行"未对id 键盘的SQL 是64 位有符号整数对于表中的每一项都页p_id1

将每个SQL 表的内容存储在数据库中文件的第一个组合用各种列中的值为byte 数组在记录格式然后将应用程序的字节数组作为存储在表中的输入项视图定义值在记录的顺序相同中列的顺序SQL 表定义如果SQL 表, 其中包含INTEGER PRIMARY KEY 列(别名未对id 该列中), 则出现在记录作为NULL 值SQLite将一直使用该表视图定义key , 而不是使用NULL 值在引用INTEGER PRIMARY KEY 列.

如果相似性在列是否REAL , 并且含有数值的列可以转换为整数在不损失信息(如果该值包含不明确的小数部分和太大, 无法表示为整数), 则该列会存储在记录为整数SQLite转换回浮点值当从记录提取它

2SQL 的索引%4表示形式

每个SQL 索引, 不管是通过显式地声明变量.CREATE INDEX 语句或UNIQUE 约束所隐含的, 对应于一个索引id1 在数据库文件有多个条目索引视图定义中的相应的表中的每一行密钥添加到索引视图定义是一个记录中的正在编入索引的列都有未对id 表行在表中每行的, 因为有一个唯一的未对id 和所有键可以在索引中包含未对id , 在索引中的所有项都是唯一的

行之间有一对一映射表和每个项中与该表关联的索引相应的行int 该索引和表b-trees 共享相同的未对id 值所有索引列, 并且包含相同的值

25 存储SQL 数据库模式

第2页的数据库文件被根页的表视图定义保存着一个特殊的"sqlite_master "(名为的表或"sqlite_temp_master "中TEMP 完成数据库)它存储数据库模式sqlite_master表的结构是确定其所创建使用以下SQL:

CREATE TABLE sqlite_master( 
请键入文字, 
名称文本.
tbl_name 文本.
rootpage 整数, 
sql 文本
);

sqlite_master 表中的每个行表、索引、查看和触发器在数据库模式, 且没有sqlite_master 表本身的条目

在sqlite_master类型列将下列文本串: 'able ", ''index ", ''view ", 或'rigger "根据定义的类型的对象'able'' string 是用于普通和虚拟表.

在sqlite_master名称列将保持该对象自动创建的索引UNIQUE 或PRIMARY KEY 约束名称为"sqlite_autoindex_TABLE_N "where TABLE 为的名称表, 该表包含将替换约束的整数, n是从1开始计数和增加是由一个与每个约束seen

在sqlite_mastertbl_name 列保存表或视图的名称关联的对象为表或视图, tbl_name 列中的值是"姓名"列的副本为索引.tbl_name 的表的名称对于该索引是某个触发器, tbl_name 列将新表或视图使激发触发器

在sqlite_masterrootpage 列存储当前网页的视图定义页对于表和索引属性"对话框中的"常规"选项卡用于定义、触发器、视图和虚拟表, 该列必须为0或NULL rootpage

在sqlite_mastersql 列存储SQL 文本, 它描述对象此SQL 文本.CREATE TABLE , CREATE VIRTUAL TABLE , CREATE INDEX , CREATE VIEW 或CREATE TRIGGER 如果数据库中的语句, 当它是主数据库中的特定文件数据库连接将重新创建该对象在文本)通常是一个副本sysconst.bak 语句用于创建该对象但应用normalizations , 使文字符合以下规则:

  • 在CREATE, TABLE, VIEW, TRIGGER, 和INDEX 的关键字末尾处语句将转换为全部大写的字母.
  • 将删除TEMP 或TEMPORARY 关键字如果出现在初始CREATE 关键字.
  • 您可以随时发生的数据库名称限定符名称即将创建的对象.
  • 删除前导空格
  • 所有空格的前两个关键字都被转换为一个.默认值为false .可读写.

在sqlite_mastersql 列是一副本sysconst.bak CREATE 文本.创建此对象的语句中, 除了标准化如上面所述, 也可以修改由后续的ALTER TABLE 语句.

自动创建的索引UNIQUE 或PRIMARY KEY 约束, 则sqlite_mastersql 字段是NULL

30 安装的"回滚日记

在安装的"回滚日志是一个文件与每个SQLite 相关联的数据库文件, 它包含用来将数据库文件还原到它的初始状态的事务在安装的"回滚日记文件始终位于同一个目录作为文件和数据库有相同的名称数据库文件, 但替换为"-journal "附加只能存在一个日志回滚相关联的数据库和因此, 只能有一个事务来说, 打开针对单个数据库

如果事务已中止, 因为出现应用程序崩溃一个操作系统崩溃增强团队成员之间的交流电源故障或崩溃数据库可能会留成在不一致的状态将在下次SQLite 尝试打开数据库文件在安装的"回滚"的存在小于等于文件将被检测到并将会自动将数据库恢复到其回放开始时的状态不完整的事务

使用回滚日志是只有看作是有效的如果该文件存在并包含有效的头因此, 一个事务可以为三种方式之一:

  1. 在安装的"回滚日志文件可将其删除.
  2. 在安装的"回滚日志文件将被截断为零长度
  3. 可以被改写代码日志回滚使用无效标题.文本(例如, 所有的zeros) .
有三种方法的提交事务对应于DELETE, TRUNCATE, 和PERSIST 设置, 分别journal_mode 大全 .

有效的日记以回滚头, 请执行以下任一项操作:

回滚日记标题格式
偏移 大小 说明
0 8 标题字符串: 0xd9 、0xd5 0x05 , 0xf9 , 0x20 , 0xa1 , 0x63 , 0xd7
8 4 "page 计数"-在接下来的页数.日记或-1, 意思是段从所有内容添加到文件的结尾
12 4 一个随机的nonce 的校验和
16 4 pages 中的初始大小数据库
20 4 假定的磁盘扇区的大小已写入此字段的进程
24 4 在此字段中图片大小

将一个回滚日记头用global $variable ;零到单个扇区的大小(由20) 偏移位置处扇区大小为整数某一扇区页眉是通过它, 以便如果发生断电写入扇区, 该信息包含以下页眉将undamaged (应用程序)

在头信息和区域提升是零个或多个网页记录每个page 记录存储的副本从数据库中的页的内容之前, 该文件更改相同的页面可能多次出现在单个日志回滚无法执行回滚不完整的事务要读取日志回滚一个进程有歧义开始和结束时间页在日记中找到推回数据库文件, 在相应位置

数据库页"%s"读取偏移位置处整数的值(24 对话框中的标题n)然后记录的页格式如下:

回滚小于等于页格式
偏移 大小 说明
0 4 在数据库中文件
4 n 原始的内容之前启动的事务
n+4 4 校验和

crc1 是无符号32 位整数的名称是什么?

  1. 初始化nonce 的校验和到校验和值在日记中找到页眉在偏移位置12 .
  2. 初始化索引xn-200 (其中n是数据库的大小以字节为单位的页面.
  3. 解释要四个字节的偏移量x至页面为4字节大端字节无符号整数向校验和的值的整数
  4. subtrace 200 x.
  5. 如果x是大于等于零, 则转到步骤3

用于校验值的规则不完整的写入一个日记中记录电源故障是否有不同的随机nonce 每次将启动一个事务中将风险降至最低到浮点扇区由resource kit 包含与同一页上的数据在日记账的一部分通过更改nonce 的每个交易, 就陈旧的磁盘上的数据将生成一个不正确的校验和和检测到的高概率crc1仅使用一个稀疏的文件该数据的32 位单词"示例记录出于性能考虑在SQLite 规划阶段3-设计研究00向性能并点击在checksumming 整页

清单1.页计数为%2, 但在偏移量的日记帐分录的头8英寸m如果m大于零然后在m页日记帐分录文件可能为零global $variable ;记录到下一个倍数扇区的大小和另一个日记头插入所有分列标头, 以便在同必须包含相同的数据库页面大小和扇区大小

如果m是-1的页记录日记页眉, 则将数字按照通过计算多少个记录的其余部分删除文档中空间的日志文件.

40 Write-Ahead 日志

开始版本370 , SQLite 支持新的事务控制机制称为"windows mobile 设备中心"或"WAL "当数据库处于WAL 模式, 该数据库的所有连接, 必须使用WAL特定数据库将使用一个回滚日记或一个WAL, , 但不能同时在相同的时间WAL始终位于同一个目录作为文件和数据库具有相同的名称数据库文件, 但替换为"-wal "追加.

41 WAL 文件格式

在WAL 文件由一头后面跟零个或多个"frames "每一帧记录修订后的内容从数据库中的单个页文件通过写入帧对数据库所做的所有更改将被记录到WAL事务提交当写入一个框架包含一个commit 标记单个WAL 和若要更正此问题, 记录的检查点定期将内容, WAL 被传送回数据库文件在某项操作调用一个"checkpoint "

单个WAL 文件可以多次重复使用换句话说, 那么WAL 可以使用框架的所有通知和checkpointed 然后可以覆盖的帧WAL始终增长从某单词或词组开头校验码和计数器附加到每一帧该框架内的WAL 有效以及哪些leftovers , 请选择以下检查点

WAL 标头大小为32 字节, 并由以下八个big-endian 32 位无符号整数值:

WAL 标题格式
偏移 大小 说明
0 4 magic number0x377f0682 或0x377f0683
4 4 版本的文件格式当前3007000
8 4 数据库页大小示例: 1024
12 4 检查点的序列号
16 4 与每个检查点salt-1 : 随机整数递增
20 4 salt-2 : 为每个不同的随机数字检查点
24 4 checksum-1 : 第一部分, 总和检查值在前24 个字节
28 4 checksum-2 : 第二部分校验和在前24 个字节

wal-header 由于下列原因是零个或多个帧每个框架由24-byte frame-header 后面跟一个page-size 字节的页数据frame-header为六个big-endian 32 位无符号整数值, 如下所示:

WAL 框架页眉格式
偏移 大小 说明
0 4 页码
4 4 提交的记录, 该数据库文件大小的更改在提交后页中对于其他记录, 为零
8 4 salt-1 从WAL 复制头
12 4 salt-2 从WAL 复制头
16 4 checksum-1 : 累计checksum 通过和其中包括此页
20 4 checksum-2 : 值就是累积的校验和

框架是认为是有效的如果且仅当下列条件为真时:

  1. 在"frame-header salt-1 和salt-2 值在wal-header 盐值相匹配

  2. 在最终的8个字节的校验和值frame-header 完全匹配的校验和计算的连续WAL 页眉和8个字节和所有帧的内容并包括在当前帧中

42 校验和算法

解释输入的校验和通过作为偶数个无符号32 位整数: 通过x(n) x(0 )用于big-endian 32 位整数是4个字节的数值下面是整数的WAL 头为0x377f0683 和little-endian magic number 为0x377f0682在"帧标头校验和值始终为存储big-endian 格式显示, 而不必考虑使用的是哪种字节顺序是用来计算的校验和

校验和算法只对内容长度为8字节的倍数换句话说, 如果输入是x(0 )到x(n )然后n必须是偶数校验和算法如下:

s0 =s1 =0
for i从0到measures 维度的步骤3: 
s0 += x(i )+s1 ;
s1 += x(i+1 )+s0 ;
例如
#导致s0 和s1 

输出s0 及s1 都使用加权校验值以相反的顺序使用fibonacci 权重〗使用linq (fibonacci 重量第一个元素的序列发生求和)s1 值跨越32 位整数的全部序列(unc )而s0 final 术语

43 检查点算法

上检查点刷新WAL 首先, 使用xsync 持久存储的方法VFS 然后有效WAL 传递到数据库中文件的内容最后, 该数据库已被另一个程序使用的条目数持久存储使用xsync 方法调用在您的xsync 操作作为写入栅-所有通用属性之前, 必须首先完成xsync 在xsync 开始运行之后的所有写入一个文件

在每次检查点, WAL 页眉salt-1 值增加和salt-2 值为randomized这将防止新旧帧WAL 被认为是有效的很长的时间和操作在一起了下列一个崩溃

44 读取器算法

从数据库中要读取页(页码p) 调用它, 一个读卡机首先检查WAL 以查看它包含的页p如果是这样的话, 那么最后的有效网页p实例其后是提交框架或提交框架中的控件读取的值第p页, 如果WAL 不包含任何有效, 并且它们是提交框架或后跟一个提交框架然后是从数据库中读取的第&&p页

要启动一个读取事务, 这是个记录在WAL 最后的有效框架的索引读取器使用此类录制的"mxframe "选项"对话框的"常规"选项卡的所有后续读取操作新事务可以附加到WAL但是只要读取器将使用其原始mxframe 值并忽略随后附加内容读取器将看到一个一致的数据库从单点在特定时间的快照此技术允许多个并发读者可同时查看不同版本的数据库内容

读取器算法在前面的单词是否工作正常但是, 因为第p页可以出现在WAL 任意的框架无法读取器, 扫描整个WAL 要查看的页p帧如果WAL 是大型(多个兆字节是典型值), 手动扫描速度可能较慢, 并读取性能解决这个问题, 一个单独的数据结构图调用wal-index 是维护的并发性搜索特定页的帧

45 WAL-Index 格式

从概念上讲, 到的wal-index 是共享的内存, wal-index 当前VFS 实现使用mmapped 文件为: mmapped 文件不在同一个目录作为数据库和具有相同的名称作为具有"数据库-shm "后缀附加由于wal-index 是共享的内存, SQLite 不支持journal_mode=WAL 在网络上文件系统当客户机安装在不同的计算机上所有用户的数据库必须能共享相同的内存

在wal-index 的目的在于快速这个问题的答案:

给定的页码p和最大WAL 框架中的索引m, m, 返回最大的WAL 框架索引中的页p, 并且不超过m, m, 或返回NULL 如果没有框架的页pm.不要超过

"m在下一段的值为"mxframe "〗中定义的第5节4可被在事务开始处然后从WAL , 它定义了这个最大帧读取器将使用的端点

wal-index 是暂时的在崩溃之后, 角落wal-index 是从原始WAL 文件所要求的VFS 截断或零头的wal-index 当它关闭前一次连接由于wal-index 是暂时的, 它使用了architecture-specific 格式;它不一定要跨平台因此, 使用数据库和WAL 文件格式存储所有的值作为高位字节在前的多字节的值, wal-index 存储在本机字节顺序的主机

此文档有文持久状态该数据库文件和wal-index 是瞬态结构关于wal-index 的格式没有更多的信息将不会被记录到此处完整详细信息在要设置格式的wal-index 都包含在注释中的SQLite 源代码

此文档介绍并定义所使用的*数据库文件格式SQLite.

10 数据库文件

在大多数情况下.完整的状态SQLite 数据库数据库中包含一个名为"main 单一文件在磁盘上文件"

在执行事务, 默认行为是存储一些临时信息在第二个名为"rollback 日记"( 当使用替代方法是windows mobile 设备中心-或是用户输入了主机计算机)如果应用程序或崩溃日志回滚, 然后在正在完成事务包含所需紧急状态信息还原该主数据库文件的内容当显示主机的报警子集状态所需的一个回滚日记中包含的信息该数据库的快照, 我们认为它是一个"hot 日记账"热过账日记账时仅碰到一个错误恢复过程方案并会放慢, 但它们的一部分的状态一个SQLite 数据库, 因此不应忽略此文档定义的格式回滚日志(和windows mobile 设备中心file) , 但是主要焦点在主数据库文件

11 页

主数据库文件由一个或更多页一页的大小的百分比512 和65536 的幂在同一数据库相同内所有网页大小为数据库文件是由2字节整数位于偏移16 字节从数据库文件

页1开始计数.页码的最大值是2147483646 (231 -2)数据库中的最小大小SQLite 为单个512-byte 页允许的最大大小数据库2147483646 在65536 字节每页行数或140, 737, 488, 224, 256 字节(140 terabytes) 有关的信息通常SQLite 会达到最大文件大小限制基础文件系统或磁盘硬件大小限制long 类型.在它未命中的总数自己的内部大小限制

在"使用, SQLite 数据库往往范围大小从千字节到几数gb

在每一页的任意时刻, main 数据库只有一个单一的使用的是以下值中的一个:

  • lock-byte 页
  • 一个freelist 页
    • 一个freelist trunk 页
    • 一个freelist 叶页
  • 视图定义页
    • 表视图定义的内部页
    • 表叶页
    • 索引id1 的内部页
    • 索引叶页
  • 一个负载溢出页
  • 一个指针, map 页

所有的读取和写入到这些主数据库文件以在一个页面边界之间的整数, 所有写入被中页面的大小还可以读取通常是一个整数中页面的大小使用一个异常的类型时数据库中首次打开前100 个字节的数据库文件(数据库文件头)都是只读作为一个sub-page 大小

任何information-bearing 页底部的数据库的修改前, 则原始不被修改该页的内容都会写入日志回滚如果一个事务被中断, 您需要将回滚, 则回滚连接, 将数据库恢复到原来的状态熊freelist 叶填满信息, 这些需要在一个回滚且还原之前这样, 它们就不会被写入日志中这种修改为了减少磁盘I/O

12 数据库头

前100 个字节的数据库文件举例说明了数据库文件表头数据库文件头下面的被划分为字段作为表在数据库文件头多字节所有字段都将存储, 必须公司名称(big-endian)

数据库标题格式
偏移 大小 说明
0 16 字符串头: "SQLite 格式300 "
16 2 数据库页大小以字节必须作为两个512 和32768 之间的integer 类型.代表纸张大小为65536 的值1
18 1 写入版本的文件格式传统;2的1WAL .
19 1 读取版本的文件格式传统;2的1WAL .
20 1 字节的未使用的"reserved "空间末尾的每个页面通常0
21 1 负载时的最多数量的分数必须64
22 1 最小嵌入式负载时的分数必须是32
23 1 叶负载时的分数必须是32
24 4 文件更改计数器.
28 4 pages 中的数据库文件大小的更改"in-header数据库大小"
32 4 如果页面的第一个freelist trunk
使用键盘和鼠标创建和编辑公式"第36 4 freelist 页的总数
40 4 该架构cookie .
44 4 该架构格式数支持的架构格式是1, 2, 3, 4
48 4 缓存大小默认网页
52 4 根最大的页号为视图定义页auto-vacuum 或incremental-vacuum 模式, 或零中时, 否则.
56 4 数据库文本文件组值1表示UTF-8值为2意味着UTF-16le值为3表示UTF-16be
60 4 代理以读/写和"user 版本"user_version 大全 .
64 4 为incremental-vacuum true (非零)模式为false (0)否则
68 24 保留的扩展必须为零
92 4 "version-valid-for 编号.
96 4 SQLITE_VERSION_NUMBER

121 magic 头字符串

所有有效的SQLite 数据库文件始于以下16 个字节(在hex) : 53 51 4c 69 74 65 20 66 递减顺序72 6d 61 74 20 33 00此"SQLite 格式的字节序列对应于UTF-8 字符串3"包括nul 终结器中的字符结束

122 页大小

在two-byte 16 偏移位置处开始的值将决定该页大小SQLite版本3701 及更早的版本, 此值为每一行都被当作大端字节整数和指定的两个512 和32768 之间的百分比数字SQLite开始版本371 , 纸张大小为65536 字节是受支持的在two-byte 65536 的值不能为空, 因此指定一个65536-byte 页面大小、0x00 0x01 是在偏移位置16 个的值此值可以解释为大端字节和1用户架构看作是作为一个magic number 表示65536 页面大小或一个作为低位字节在前就可以查看two-byte 字段编号, 并说它代表页面尺寸除以256这两个interpretations 字段是page-size 是等效的

123 文件版本编号格式

写入版本的文件格式和文件格式读取版本的偏移18 19 , 对于在增强功能在SQLite 的保存的文件格式在当前的SQLite, 这两个版本回滚journalling 模式的值是1, 2WAL journalling 模式如果某一版本的SQLite 编码来当前的文件格式指定遇到一个数据库读取的文件版本是1或2但写入版本大于2数据库文件必须被视为只读如果数据库文件时遇到的一个大于2是读取版本, 然后该数据库中不能读取或写入

12每页4保留图像字节

SQLite 已在"使用样板"少数几个额外字节末尾的每一个页面使用它们来扩展是否使用这些额外字节, 例如, SQLite 加密扩展插件可保存一个nonce and/or 加密与每个页面相关联的校验和"reserved空间"在偏移位置处1字节带符号整型21 群的字节数的空间末尾的每个页面来预留的扩展该值是通常0该值可以奇数

要在数据库页的""usable , 页面文件大小指定2字节整数偏移量16 在标题, 当"reserved "空间的大小1字节带符号整型中记录的偏移量20 中的标题可用大小为一个网页也可能是一个使费解但是, 可以使用大小是不允许的少于480换句话说, 如果纸张大小为512 .然后保留的空间的大小不能超过32

125 负载时的分数

最大和最小值的嵌入式负载分数与叶负载分数值必须32 、和32这些值为方面, 为可调试参数无法识别用来修改该视图定义的存储格式的算法但是, 不支持该功能并没有当前规划添加在将来的支持因此, 这三个字节的固定在指定的值

126 文件更改计数器

更改计数器该文件时就是一个4字节big-endian 整数, 它就会增加1数据库被解锁后拥有被修改当两个或更多的进程阅读数据库文件, 每个进程可以检测到数据库更改与其它进程通过监视修改计数器一个进程后, 通常要刷新其数据库页面缓存将另一个进程修改了数据库, 缓存后已成为过时该文件更改的计数器转接器

在WAL 模式下, 对数据库的更改将检测到使用了wal-index , 所以不需要更改计数器因此, 要在每个事务中的更改可能会导致计数器递增WAL 模式

127 in-header 数据库大小

4字节大端字节整数偏移28 插入页眉将数据库文件大小的更改存储在页面中如果此in-header datasize 大小(请参见下一个paragraph) 无效, 然后数据库的大小是通过查看所计算的实际数据库文件大小的更改旧版本的SQLite 已忽略该in-header 实际使用的数据库的大小和文件大小以独占方式较新版本的SQLite 使用该in-header 数据库大小如果可用, 但回退到实际文件大小如果in-header 数据库大小无效

in-header 数据库的大小只有看作是有效的如果是零, 并在4字节更改计数器在偏移位置完全匹配24 4字节version-valid-for 编号在偏移位置92in-header 数据库的大小时始终有效该数据库是只读.使用目标SQLite (3或更高版本70和later)如果创建传统的SQLite 版本将写入数据库, 它不会知道要更新in-header 数据库的大小和in-header 数据库大小可能不正确但旧式版本的SQLite 这样也会保留在偏移位置的version-valid-for 编号92 , 以便它将不会匹配change-counter因此, 无法检测无效的in-header 数据库的大小(change-counter 和被忽略)的clean "当返回到version-valid-for 不匹配

12可用页列表8

未使用的页面在数据库文件存储在freelist4 字节大端字节整数32 在服务器存储从第一页的页号为freelist , 或为零如果freelist 为空4字节的偏移位置处大端字节整数36 存储在freelist 存储图片

129 架构cookie

该架构cookie 为4字节大端字节整数偏移量40 时.就会增加1该数据库模式更改一个prepared 语句是针对特定版本的数据库模式只要数据库模式更改, 在语句必须是reprepared每当一个prepared 语句上运行架构cookie 它首先检查以确保该值是相同语句用来准备和架构时, 将cookie 已更改该语句中止为了强制该语句为reprepared

1210 schema 格式的数字

该架构格式数为4字节大端字节整数偏移量44此文件格式的schema 格式数字类似于读和写偏移18 19 版本号除了schema 格式数字引用高级SQL 格式而不是低级视图定义格式4个架构设置数字是当前定义的:

  1. 1, 可以被所有的SQLite 回版本300
  2. 格式2将同一表中的行的能力具有可变数目的列, 为了支持ALTER TABLE ...ADD COLUMN 功能阅读和编写格式支持SQLite 版本3中新增21在2005-02-19 3
  3. 格式3添加了能力通过添加额外的列ALTER TABLE ...ADD COLUMN 若要让non-NULL 默认值该功能已在SQLite 版本31在2005-03-11 4
  4. 格式4导致SQLite 尊重上的DESC 关键字索引声明(将忽略DESC 关键字中没有为格式1、2和34 的格式.)添加两个新的boolean 类型值(记录串行类型8和9SQLite 中新增)支持格式433在2006-01-10 0

新的数据库SQLite 使用所创建的文件格式1默认情况下, 因此该数据库中所创建的文件较新版本的SQLite 仍可由旧版本的SQLite 读取"legacy_file_format 大全 可以用于将导致SQLite 使用格式创建新数据库文件4以后的SQLite 可能会开始创建缺省情况下4文件使用格式

1211 建议的缓存大小

4字节的偏移量大端字节有符号整数48 是拼写建议.在页中的数据库文件缓存的大小该值是一个建议只和SQLite 下没有家长接受它accelerator属性的整数被用作合适的软件包建议根据使用缓存的大小default_cache_size 大全 .

1212 增量真空设置

在两个4字节大端字节整数的第二页52 和64 是用于管理auto_vacuum 和incremental_vacuum 模式如果在偏移位置的整数52 不为零.pointer-map (ptrmap )页有从数据库中省略文件和既auto_vacuum 也支持incremental_vacuum如果integer 偏移量52 为非零然后它是"最大的root 页在数据库文件数据库文件包含ptrmap 页显示模式必须是auto_vacuum 或incremental_vacuum在此整数定义类, 偏移量为64 为true 为incremental_vacuum 和auto_vacuum 为false如果在偏移位置的整数52 不为零.还必须在偏移位置的整数64 零

1213 .

4字节大端字节整数的偏移量56 确定要使用的编码处的字符串存储在数据库中的所有文字值1表示UTF-8值为2意味着UTF-16le值为3表示UTF-16be没有其他允许的值

1214 用户版本号

4字节大端字节整数偏移量60 是用户版本该错误的原因可能是设置和查询的user_version 大全 使用的用户就是SQLite

1215 写库版本号和version-valid-for 数

4字节大端字节整数96 存储在服务器SQLITE_VERSION_NUMBER SQLite 库, 它最近一次修改的值数据库文件4字节big-ending 整数偏移量92 的值更改计数器当存储的版本号92个事务的偏移位置处整数版本号是有效的, 可以返回到"version-valid-for 和有时称为"

1216 头保留的空间中为扩展

文件标头的数据库的所有其他个字节是保留以供将来拓展必须设置为零

13 Lock-Byte 页

页面在对页面进行lock-byte 字节的数据库文件, 包含在1073741824 之间的偏移和1073742335 , 非独占一个小于或等于数据库文件时1073741824 字节中没有包含lock-byte 页命名文件大于1073741824 精确包含一个lock-byte 页面

页面在"使用样板"lock-byte 操作系统使用的特定VFS 在包中实现数据库实现文件锁定图元SQLite不能使用lock-byte 页SQLite核心将永远不会读取或写入, 虽然操作系统特定的VFS 实现可能在lock-byte 页中读取或写入字节根据需求和proclivities 的基础系统unix和win32 VFS 实现了内置到SQLite 不写入lock-byte 页面中, 但是第三方VFS 实现对其他操作系统可能无效.

14 的freelist

命名文件可以包含一个或多个页面将会在active未使用的页面可关于, 例如, 当从数据库中删除详细信息未使用的页面时, 会重新使用存储在freelist 并附加网页是必需的

指定freelist 的组织方式的每个trunk 页面的网页的freelist trunk 列表为零个或多个freelist 叶页的详细内容.请单击.

一个freelist trunk 页面包含的4字节大端字节整数的数组任意整数数组的大小将在新建对话框中可用的空间的页面所允许的最小可用空间480 字节数组.将始终被中至少有120 条目长度在页面的数组为number 的第一个整数的下一个freelist trunk 在列表或零个页如果这是域中最后freelist trunk 页在数组的第二个整数只有sysadmin 角色的成员才能遵循的指针, 调用第二个整数l如果l大于零的整数数组索引介于2和l+1 包容包含freelist 叶页的页码

freelist 叶不包含详细信息的页面SQLite避免读取或者写入freelist 叶页面的顺序来减少磁盘I/O

SQLite 中的bug 3或更高版本60将数据库改了损坏的数据如果任何页数组最后一个6freelist trunk 中的条目包含非零值此较新版本的SQLite 没有问题然而较新版本的SQLite 仍然避免使用页数组最后一个六个freelist trunk 中的条目在该数据库中所创建的文件较新版本的SQLite SQLite 更早版本可以读取.

freelist 数为4字节大端字节整数存储在数据库标题从最开始处的偏移36 文件数据库标题也可在页的第一个freelist trunk 网页作为一个4字节大端字节整数从最开始处的偏移32 文件

15 视图定义页

一个视图定义网页是一个内部页或非叶只有sysadmin 角色的成员才能包含键如果在一个表视图定义每个键具有关联的内容内部页面中包含k键没有内容, 但带有k+1 子级的指针, 视图定义页一个在内部视图定义页"pointer "就是31-bit 整数页码的子页

定义非叶深度的视图定义是1和所有内部视图定义是一种深度超过了它的任何子级的最大深度在customerinfo 数据库中, 所有子级中的任何一个内部视图定义具有相同的深度

在内部视图定义page 、指针和键逻辑上备用的指针在两端(上一句的概念上, 未完成-实际键和布局的更改将页面更加复杂和指针都不会在sequel 页面, 如图)同一页面中的所有项都是唯一的和逻辑上按降序顺序组织从左到右(同样, 逻辑, 而不是物理页面在任意实际内的位置的密钥)对于任何键x, 指针左边的x引用id1 的网页时所有的首选项小于或等于x指针x引用不同的网页, 在右边的所有按键都大于x

在页面上的一个内部id1 , 每个键和指针为其left 组合为一个称为"cell 结构"竖直方向)指针是一种灵活的单独购买非叶视图定义页面没有指针, 但它仍使用其他单元格的结构保持项的索引b-trees 或键值为表b-trees 和内容

每个视图定义页都有至少有一个父视图定义页一个没有父称为根视图定义页页根视图定义页另一页上的强制关闭其子级形成一个完整的视图定义有可能(并在常见)使单个页面组成的一个完整的视图定义中的非叶和根由于这台计算机的指针从家长的每一页上children , 可以定位一个完整的视图定义如果只有根网页是已知的因此, b-trees 通过根页码

叶级是表视图定义页或b树页的索引视图定义页每个视图定义完成内的所有网页是相同类型: 表或索引从表有一对一映射b-trees 在数据库文件添加到数据库中的(非虚)表模式, 包括系统表如sqlite_master在数据库中存在一对一的映射索引b-trees 隐含的索引在架构文件及索引, 包括创建唯一性约束与sqlite_master 表总是有其相应的id1 上的根页中页号为1sqlite_master 表包含其他表和索引根页码.可在数据库文件

在表中的每一项都视图定义由一个64 位有符号整数的键和到2147483647 个字节的任意数据内部表格b-trees 只有键和指针的子项所有的数据在表中包含的视图定义

每个条目在索引中视图定义由任意密钥长度到2147483647 个字节的, 并且没有数据

定义要使用的"payload "的单元格的单元格的任意长度部分视图定义的索引, 密钥将总是在长度和任意因此有效负载是键没有在单元格元素中的任意长度内部视图定义页和因此, 这些单元格.没有有效负载的表视图定义叶页包含任意长度的表的内容和因此, 对于单元格中的这些页面在有效负载是内容

当为单元格负载时的大小超过了某个阈值(..."定义更高版本)的前几个字节对负载存储在视图定义页面和余额都存储在链接的列表的内容溢出页面

一个视图定义页面划分为面域按下列顺序:

  1. 数据库文件头100-byte (仅限页1)
  2. 使用8或12 字节视图定义页标题
  3. 指针数组的单元格.
  4. 一元负数
  5. 内容区域的单元格.
  6. 所有地区

数据库文件文件头为找到100-byte 只能在1页, 它总是表格视图定义中所有其他数据库文件省略此页的视图定义100-byte 头

"属性"保留的区域中不用的空间末尾的每个页面(除"锁定"页面), 扩展可以用来保持per-page 详细信息保留的区域的大小是由one-byte 找到无符号整数在偏移20 安装到数据库中文件表头保留的区域的大小(通常为零

页脚视图定义为8字节的叶页和12 个字节用于内部页面所有多字节的值请在页眉大端字节页脚视图定义由以下字段:

视图定义页眉格式
偏移 大小 说明
0 1 一个表示视图定义标志值2表示该页面是内部索引视图定义页值为5表示该页是一个内部表视图定义页一个值为10 表明该页为叶索引视图定义页一个值为13 表明该页为叶表视图定义页其他任何值为id1 页类型是一个错误
1 2 字节偏移量至页面的第一个freeblock
3 2 该页上的单元格的个数
5 2 内容区域的单元格要变换的第一个字节一个零值为用来表示一个偏移位置, 16.7m 发生在空的根元素, 包含在页面当您使用65536-byte
7 1 在单元格中数字的wins 释放字节内容区域
8 4 该竖直方向)指针(仅限内部视图定义页)

视图定义页面中的单元格指针数组的紧跟在该视图定义页标题让known _y'' s是在b树的单元格数目此单元格指针数组由k2字节整数偏移的工作内容在键顺序排列的指针是随单元格右边的单元格("最小的单元格条目)名字和竖直方向)单元格(最大的密钥)最后的单元格.

单元格中的内容存储在单元格中的内容区域的视图定义页SQLite都力求来引用单元格为远id1 , 因为它可为下列的末尾, 为了保留空间, 以备将来的单元格指针数组该区域中的最后一个单元格.指针数组项之间的结尾的第一个单元格是未分配地区

如果页中没有包含单元格中的每一个根(这是我为一个表, 该表包含没有行)然后内容区域的偏移量单元格将等于该页大小减去字节的reserved space如果该数据库使用65536-byte 页面尺寸和reserved space 为零(.那么将保留空间)然后将计算内容的偏移为一个空页想要65536但是, 该整数太大, 不能存储在2字节不带符号整型, 因此值为0是子资源定位器

freeblock 是一种用于标识一个视图定义页面中的未分配空间内结构freeblocks链也不会将收件人添加到任何邮件列表2个字节一个freeblock 是一种大端字节整数, 它是在视图定义中的证书链中的下一个freeblock如果freeblock 或零是在最后一个链第三个和第四个字节的每个freeblock 表单大端字节整数, 它是freeblock 的大小以字节为单位, 包括4字节头freeblocks不会总是连接不断增加的偏移页脚第二个字段的视图定义是freeblock 数组的大小, 或零.如果没有freeblocks 在页面上在customerinfo 视图定义"页上, 将一个第一个freeblock 之前始终将至少有一个单元

freeblock 至少需要4字节的空间如果在组的末尾有一个单独的组1、2或3在单元格中未使用的字节内容区域, 那些字节包含片段将显示所有碎片的总数存储在第五个字段的视图定义页标题在css 视图定义页面上, 碎片的总数字节可能不要超过60

总的可用空间量视图定义页面包含未指派区域的大小的所有freeblocks 加上数目的总大小零碎免费的字节SQLite可能从reorganize 发现了一个视图定义字节页, 这样没有freeblocks 或片段所有未使用的字节都包含在未指派空间区域和所有单元格是紧实的紧密地必须在网页结尾这被称为"defragmenting "视图定义页面

长度可变的整数或"varint "是一种静态的64 位twos-complement 整数的huffman 编码, 使用较少的空间for small 正值一个varint 介于1和9个字节在varint 由零个或多个字节它们具有2010 集后跟一个字节使用2010 清除或9个字节这个短在每第一个8个八位字节和所有第九个字节8位为用于重新构建的64 位twos-complement 整数varints都从较早的big-endian : 字节的varint 就是多个并位由更高版本字节

单元格的格式取决于单元的哪些类型的视图定义页上会出现下表显示了在单元格的元素, 在各种id1 的出现顺序, 网页类型


表B-Tree 叶单元:

  • varint 这是总数的有效负荷, 包括任何溢出
  • 一个varint key , 一个整数k一个"rowid"
  • 在"有效负载不可舍出的页溢出
  • 4字节的大端字节整数页面的第一页上溢网页列表-如果是否适合所有有效负载视图定义页.

表B-Tree interior 属性:

  • 一个4字节big-ending 页码指定左边的指针.
  • varint 这是整数的键

索引B-Tree 叶单元:

  • 一个varint key 负载时的字节的总数, 包括任何溢出
  • 在"有效负载不可舍出的页溢出
  • 4字节的大端字节整数页面的第一页上溢网页列表-如果是否适合所有有效负载视图定义页.

索引B-Tree 内部单元格中:

  • 一个4字节big-ending 页码指定左边的指针.
  • 一个varint key 负载时的字节的总数, 包括任何溢出
  • 在"有效负载不可舍出的页溢出
  • 4字节的大端字节整数页面的第一页上溢网页列表-如果是否适合所有有效负载视图定义页.

上面的信息可以recast 到一个表格式如下所示:

视图定义单元格格式
数据类型 出现在...... 说明
表叶 表内部 索引叶 索引内部
4字节整数     页面左数
varint   有效负荷的字节数.
varint     未对id
字节数组   有效负荷
4字节整数   第一个溢出页的页码

有效负荷, 分析数据量到绘图页上溢出页也取决于multiline 的类型支持以下计算, 让我们u可用大小为一个数据库"页上, 单击"大小", 当reserved space 每个页面的结束然后让p是负载时的大小

表B-Tree 叶单元:

如果p小于负载时的大小或等于u-35 整个有效负载是存储在叶页让m是((u-12)*32/255)-23如果p大于u-35 然后字节的数量存储在视图定义只有sysadmin 角色的成员才能是较小的M+((P-M)%(U-4)) 和u-35注意, 存储在字节数只有sysadmin 角色的成员才能永远不会小于m

表B-Tree interior 属性:

表b-trees 内部页面的人没有有效负荷和因此永远不会是任何有效负载.

索引B-Tree 叶或内部单元格中:

让x是((u-12)*64/255)-23)如果负载时的大小p是小于或等于x整个有效负载是存储在视图定义页让m是((u-12)*32/255)-23如果p大于x然后字节的数量存储在视图定义页中较小的M+((P-M)%(U-4)) 和x注意, 索引页面上的存储过程的字节数量永远不会小于m

%a阈值被设计的最小扇出是4的索引b-trees 并以确保有足够的有效负载是在视图定义记录头状态通常可而无需咨询页面上的一个溢出在hindsight , SQLite 视图定义设计器的逻辑认识到这些阈值可能已经更改随常规对象但是, 在计算不能生成一个不兼容的情况下更改文件格式当前计算和然而, 即使它们是很复杂

16 芯负载溢出页

当负载的一个视图定义单元格为视图定义太大页, 该surplus 是spilled 拖溢出页溢出表单的页面链接的列表每个溢出页的第一个四个字节是一个大端字节整数, 它是证书链中的页码的下一页证书链中的最终的页或零第五条字节通过最后的适用性字节是使用溢出内容

17 指针映射或ptrmap 页

指针地图上或ptrmap 页面的是空白页面插入到数据库中要使操作auto_vacuum 和incremental_vacuum 在"导航"模式更有效在数据库中其他网页类型通常具有指针从父与子表例如, 内部视图定义页面中包含其子id1 指向网页和溢出某一个指针字段中设置证书链中的链接一个ptrmap 页面中包含链接信息在相对方向上, 从子父

在任何数据库必须存在ptrmap 页文件这有意义的根视图定义页值在偏移位置52 在数据库标题如果值为零, 则最大的根视图定义页.该数据库包含的ptrmap 页

在数据库包含ptrmap 页, 第一个ptrmap 页是第2页ptrmap页的5-byte 项目数组组成让j的5-byte 条目将在新建对话框中可用的空间的页面(换句话说, J=U/5第一个ptrmap 页面)将会包含_pages 的信息通过j+2 , 包括2和3第二个指针地图j+3 页的页将被和ptrmap 页面会提供信息的页面j+4 _通过2*j+3 非独占为整个数据库文件等等

在使用ptrmap 数据库中页所有网页在上一段的计算标识的位置处必须ptrmap 页, 并不需要任何其他页.可能是ptrmap 页面除如果byte-lock 页在outlook 中所发生的情况相同的页码作为ptrmap 页那么ptrmap 是移动至以下页面的一个case

在ptrmap 页面提供了每个5-byte 条目back-link 有关一个紧跟在指针的映射如果网页b是一个ptrmap 页然后back-link 关于页面b+1 是由指针上的第一个条目映射有关页面上b+2 是由第二项等等

每个5-byte ptrmap 条目由一个字节"page 类型"信息后跟一个4字节big-endian 页码五个识别网页类型:

  1. 一个根页该值应为零
  2. 一个freelist 页该值应为零
  3. 一个单元格负载第一页的溢出链该值已超出该视图定义包含该单元格的内容页面溢出
  4. 发生溢出链中的页行或列的第一个页该值已溢出先前的页的链
  5. 非root 用户视图定义页该值已父视图定义页

在任何数据库文件包含ptrmap 页面, 所有任何可归纳元素必须出现在根视图定义页, 单元格有效负载溢出页面上, 或freelist该限制可以确保根期间都不会移动页面auto-vacuum 或incremental-vacuumauto-vacuum 逻辑不能知道如何更新sqlite_master root_page 字段的表和它是必需的, 以防止根页在移动过程中另一个auto-vacuum , 以保持数据的完整性sqlite_master 表根页面移动到起始的数据库文件由CREATE TABLE, CREATE INDEX, DROP TABLE, 和DROP INDEX 操作

20 架构图层

低方面的foregoing 文字描述了SQLite 文件格式视图定义机制提供了一个强大而有效的方法访问大型数据集本节将描述了如何低级视图定义层就是用于实现较高级别的SQL 功能

21 记录格式

一个表视图定义叶页的内容和任何的键索引视图定义页的输出条件作为任意序列先前提到的讨论一个小于另一个基元类型, 但没有定义什么"less 比"快速将地址这些只是在当前分区

有效负荷, 或者是表格内容或索引键, 不总是在"record 格式"对应的记录格式定义值序列的一个表或索引中的列记录格式指定数目的列, 则每个数据类型的列, 每个列的内容

记录格式提供的使用长度可变的整数或varint 表示的64 位有符号定义上面的整数.

记录包含一个标题和正文, 顺序这是要被用单个varint 头, 它确定头中的字节的总数varint值被头的大小以字节为单位包括的大小varint 本身如下varint 大小的一个或多个附加varints , 一个列这些附加"serial 被调用的varints 类型"数字和确定该数据类型的表中的每一列, 遵循下面的图表:

串行类型代码的记录格式
串行类型 目录大小 含义
0 0 NULL
1 1 8位twos-complement 整数
2 2 大端字节16 位twos-complement 整数
3 3 big-endian 24 位twos-complement 整数
4 4 big-endian 32 位twos-complement 整数
5 6 big-endian 正向twos-complement 整数
6 8 big-endian 64 位twos-complement 整数
7 8 big-endian IEEE 数字754-2008 64 位浮点数
8 0 整数常数0只适用于schema 格式4和更高版本
9 0 整数常量1只适用于schema 格式4和更高版本
10, 11   未使用保留的扩展
n≥12和偶数页 (n-12)/2 一个长度为(n-12)/2 字节在BLOB
n≥13和奇数 (n-13)/2 在数据库中一个字符串编码和长度(n-13)/2 个字节如果省略nul 的终止符

注意, 因为的varints 定义, 页眉的大小varint 和串行类型varints 通常包括一个字节串行类型对于大型字符串和BLOBs varints , 可能会扩展两个或三个字节varints , 但也可以是异常而不是规则varint格式是在编码是非常高效的记录头

每一列的值在记录紧跟在页眉请注意, 对于串行类型0, 8、9、12 、13 .则该值为零个字节如果对这种类型的所有列都记录的正文部分为空

22 记录的排序次序

键在索引视图定义的顺序是由排序顺序记录的键表示记录按列比较两个列从左至右列的记录都被检查对列都将次序确定的相对顺序两个记录排序顺序是单独的列如下所示:

  1. NULL 值(串口)排序类型"0"
  2. 数值(串口类型1至9)next 并按照数字顺序进行排序
  3. 文本值(甚至串行12 和更大的)排序的顺序由列比较函数
  4. BLOB 值(奇数串行类型13 和更大的)确定memcmp() 顺序最后进行排序.

一个比较函数对于每一个列是必要的计算中的文本.SQLite 定义三种内置的比较功能:

BINARY 字符串是逐字节比较使用memcmp( )函数从标准c库失败
NOCASE 类似BINARY 只不过大写ASCII 字符(''a 通过''z '' '' )将页它们的小写形式相当于运行就是这样的比较注意只有ASCII 字符都case-foldedNOCASE 不实现一个通用unicode caseless 比较
RTRIM 像BINARY 除了空格的字符串是要比较之前, 请先elided

其他特定于应用程序的比较函数可以添加到SQLite 使用sqlite3_create_collation( )接口.

默认的比较函数的所有字符串是BINARY可选中指定的比较顺序的函数表的列可以是CREATE TABLE 使用COLLATE 子句的语句列定义仅当使用了列的索引是, 在执行比较函数中指定的CREATE TABLE 语句用于该列中的索引.默认情况下.虽然此可重写的使用COLLATE 子句的select 语句中CREATE INDEX 语句.

2SQL 表3表示形式

架构中的每个普通SQL 表在数据库中支持事务磁盘上的表视图定义在表中的每一项都视图定义对应于SQL 表中的某一行"未对id 键盘的SQL 是64 位有符号整数对于表中的每一项都页p_id1

将每个SQL 表的内容存储在数据库中文件的第一个组合用各种列中的值为byte 数组在记录格式然后将应用程序的字节数组作为存储在表中的输入项视图定义值在记录的顺序相同中列的顺序SQL 表定义如果SQL 表, 其中包含INTEGER PRIMARY KEY 列(别名未对id 该列中), 则出现在记录作为NULL 值SQLite将一直使用该表视图定义key , 而不是使用NULL 值在引用INTEGER PRIMARY KEY 列.

如果相似性在列是否REAL , 并且含有数值的列可以转换为整数在不损失信息(如果该值包含不明确的小数部分和太大, 无法表示为整数), 则该列会存储在记录为整数SQLite转换回浮点值当从记录提取它

2SQL 的索引%4表示形式

每个SQL 索引, 不管是通过显式地声明变量.CREATE INDEX 语句或UNIQUE 约束所隐含的, 对应于一个索引id1 在数据库文件有多个条目索引视图定义中的相应的表中的每一行密钥添加到索引视图定义是一个记录中的正在编入索引的列都有未对id 表行在表中每行的, 因为有一个唯一的未对id 和所有键可以在索引中包含未对id , 在索引中的所有项都是唯一的

行之间有一对一映射表和每个项中与该表关联的索引相应的行int 该索引和表b-trees 共享相同的未对id 值所有索引列, 并且包含相同的值

25 存储SQL 数据库模式

第2页的数据库文件被根页的表视图定义保存着一个特殊的"sqlite_master "(名为的表或"sqlite_temp_master "中TEMP 完成数据库)它存储数据库模式sqlite_master表的结构是确定其所创建使用以下SQL:

CREATE TABLE sqlite_master( 
请键入文字, 
名称文本.
tbl_name 文本.
rootpage 整数, 
sql 文本
);

sqlite_master 表中的每个行表、索引、查看和触发器在数据库模式, 且没有sqlite_master 表本身的条目

在sqlite_master类型列将下列文本串: 'able ", ''index ", ''view ", 或'rigger "根据定义的类型的对象'able'' string 是用于普通和虚拟表.

在sqlite_master名称列将保持该对象自动创建的索引UNIQUE 或PRIMARY KEY 约束名称为"sqlite_autoindex_TABLE_N "where TABLE 为的名称表, 该表包含将替换约束的整数, n是从1开始计数和增加是由一个与每个约束seen

在sqlite_mastertbl_name 列保存表或视图的名称关联的对象为表或视图, tbl_name 列中的值是"姓名"列的副本为索引.tbl_name 的表的名称对于该索引是某个触发器, tbl_name 列将新表或视图使激发触发器

在sqlite_masterrootpage 列存储当前网页的视图定义页对于表和索引属性"对话框中的"常规"选项卡用于定义、触发器、视图和虚拟表, 该列必须为0或NULL rootpage

在sqlite_mastersql 列存储SQL 文本, 它描述对象此SQL 文本.CREATE TABLE , CREATE VIRTUAL TABLE , CREATE INDEX , CREATE VIEW 或CREATE TRIGGER 如果数据库中的语句, 当它是主数据库中的特定文件数据库连接将重新创建该对象在文本)通常是一个副本sysconst.bak 语句用于创建该对象但应用normalizations , 使文字符合以下规则:

  • 在CREATE, TABLE, VIEW, TRIGGER, 和INDEX 的关键字末尾处语句将转换为全部大写的字母.
  • 将删除TEMP 或TEMPORARY 关键字如果出现在初始CREATE 关键字.
  • 您可以随时发生的数据库名称限定符名称即将创建的对象.
  • 删除前导空格
  • 所有空格的前两个关键字都被转换为一个.默认值为false .可读写.

在sqlite_mastersql 列是一副本sysconst.bak CREATE 文本.创建此对象的语句中, 除了标准化如上面所述, 也可以修改由后续的ALTER TABLE 语句.

自动创建的索引UNIQUE 或PRIMARY KEY 约束, 则sqlite_mastersql 字段是NULL

30 安装的"回滚日记

在安装的"回滚日志是一个文件与每个SQLite 相关联的数据库文件, 它包含用来将数据库文件还原到它的初始状态的事务在安装的"回滚日记文件始终位于同一个目录作为文件和数据库有相同的名称数据库文件, 但替换为"-journal "附加只能存在一个日志回滚相关联的数据库和因此, 只能有一个事务来说, 打开针对单个数据库

如果事务已中止, 因为出现应用程序崩溃一个操作系统崩溃增强团队成员之间的交流电源故障或崩溃数据库可能会留成在不一致的状态将在下次SQLite 尝试打开数据库文件在安装的"回滚"的存在小于等于文件将被检测到并将会自动将数据库恢复到其回放开始时的状态不完整的事务

使用回滚日志是只有看作是有效的如果该文件存在并包含有效的头因此, 一个事务可以为三种方式之一:

  1. 在安装的"回滚日志文件可将其删除.
  2. 在安装的"回滚日志文件将被截断为零长度
  3. 可以被改写代码日志回滚使用无效标题.文本(例如, 所有的zeros) .
有三种方法的提交事务对应于DELETE, TRUNCATE, 和PERSIST 设置, 分别journal_mode 大全 .

有效的日记以回滚头, 请执行以下任一项操作:

回滚日记标题格式
偏移 大小 说明
0 8 标题字符串: 0xd9 、0xd5 0x05 , 0xf9 , 0x20 , 0xa1 , 0x63 , 0xd7
8 4 "page 计数"-在接下来的页数.日记或-1, 意思是段从所有内容添加到文件的结尾
12 4 一个随机的nonce 的校验和
16 4 pages 中的初始大小数据库
20 4 假定的磁盘扇区的大小已写入此字段的进程
24 4 在此字段中图片大小

将一个回滚日记头用global $variable ;零到单个扇区的大小(由20) 偏移位置处扇区大小为整数某一扇区页眉是通过它, 以便如果发生断电写入扇区, 该信息包含以下页眉将undamaged (应用程序)

在头信息和区域提升是零个或多个网页记录每个page 记录存储的副本从数据库中的页的内容之前, 该文件更改相同的页面可能多次出现在单个日志回滚无法执行回滚不完整的事务要读取日志回滚一个进程有歧义开始和结束时间页在日记中找到推回数据库文件, 在相应位置

数据库页"%s"读取偏移位置处整数的值(24 对话框中的标题n)然后记录的页格式如下:

回滚小于等于页格式
偏移 大小 说明
0 4 在数据库中文件
4 n 原始的内容之前启动的事务
n+4 4 校验和

crc1 是无符号32 位整数的名称是什么?

  1. 初始化nonce 的校验和到校验和值在日记中找到页眉在偏移位置12 .
  2. 初始化索引xn-200 (其中n是数据库的大小以字节为单位的页面.
  3. 解释要四个字节的偏移量x至页面为4字节大端字节无符号整数向校验和的值的整数
  4. subtrace 200 x.
  5. 如果x是大于等于零, 则转到步骤3

用于校验值的规则不完整的写入一个日记中记录电源故障是否有不同的随机nonce 每次将启动一个事务中将风险降至最低到浮点扇区由resource kit 包含与同一页上的数据在日记账的一部分通过更改nonce 的每个交易, 就陈旧的磁盘上的数据将生成一个不正确的校验和和检测到的高概率crc1仅使用一个稀疏的文件该数据的32 位单词"示例记录出于性能考虑在SQLite 规划阶段3-设计研究00向性能并点击在checksumming 整页

清单1.页计数为%2, 但在偏移量的日记帐分录的头8英寸m如果m大于零然后在m页日记帐分录文件可能为零global $variable ;记录到下一个倍数扇区的大小和另一个日记头插入所有分列标头, 以便在同必须包含相同的数据库页面大小和扇区大小

如果m是-1的页记录日记页眉, 则将数字按照通过计算多少个记录的其余部分删除文档中空间的日志文件.

40 Write-Ahead 日志

开始版本370 , SQLite 支持新的事务控制机制称为"windows mobile 设备中心"或"WAL "当数据库处于WAL 模式, 该数据库的所有连接, 必须使用WAL特定数据库将使用一个回滚日记或一个WAL, , 但不能同时在相同的时间WAL始终位于同一个目录作为文件和数据库具有相同的名称数据库文件, 但替换为"-wal "追加.

41 WAL 文件格式

在WAL 文件由一头后面跟零个或多个"frames "每一帧记录修订后的内容从数据库中的单个页文件通过写入帧对数据库所做的所有更改将被记录到WAL事务提交当写入一个框架包含一个commit 标记单个WAL 和若要更正此问题, 记录的检查点定期将内容, WAL 被传送回数据库文件在某项操作调用一个"checkpoint "

单个WAL 文件可以多次重复使用换句话说, 那么WAL 可以使用框架的所有通知和checkpointed 然后可以覆盖的帧WAL始终增长从某单词或词组开头校验码和计数器附加到每一帧该框架内的WAL 有效以及哪些leftovers , 请选择以下检查点

WAL 标头大小为32 字节, 并由以下八个big-endian 32 位无符号整数值:

WAL 标题格式
偏移 大小 说明
0 4 magic number0x377f0682 或0x377f0683
4 4 版本的文件格式当前3007000
8 4 数据库页大小示例: 1024
12 4 检查点的序列号
16 4 与每个检查点salt-1 : 随机整数递增
20 4 salt-2 : 为每个不同的随机数字检查点
24 4 checksum-1 : 第一部分, 总和检查值在前24 个字节
28 4 checksum-2 : 第二部分校验和在前24 个字节

wal-header 由于下列原因是零个或多个帧每个框架由24-byte frame-header 后面跟一个page-size 字节的页数据frame-header为六个big-endian 32 位无符号整数值, 如下所示:

WAL 框架页眉格式
偏移 大小 说明
0 4 页码
4 4 提交的记录, 该数据库文件大小的更改在提交后页中对于其他记录, 为零
8 4 salt-1 从WAL 复制头
12 4 salt-2 从WAL 复制头
16 4 checksum-1 : 累计checksum 通过和其中包括此页
20 4 checksum-2 : 值就是累积的校验和

框架是认为是有效的如果且仅当下列条件为真时:

  1. 在"frame-header salt-1 和salt-2 值在wal-header 盐值相匹配

  2. 在最终的8个字节的校验和值frame-header 完全匹配的校验和计算的连续WAL 页眉和8个字节和所有帧的内容并包括在当前帧中

42 校验和算法

解释输入的校验和通过作为偶数个无符号32 位整数: 通过x(n) x(0 )用于big-endian 32 位整数是4个字节的数值下面是整数的WAL 头为0x377f0683 和little-endian magic number 为0x377f0682在"帧标头校验和值始终为存储big-endian 格式显示, 而不必考虑使用的是哪种字节顺序是用来计算的校验和

校验和算法只对内容长度为8字节的倍数换句话说, 如果输入是x(0 )到x(n )然后n必须是偶数校验和算法如下:

s0 =s1 =0
for i从0到measures 维度的步骤3: 
s0 += x(i )+s1 ;
s1 += x(i+1 )+s0 ;
例如
#导致s0 和s1 

输出s0 及s1 都使用加权校验值以相反的顺序使用fibonacci 权重〗使用linq (fibonacci 重量第一个元素的序列发生求和)s1 值跨越32 位整数的全部序列(unc )而s0 final 术语

43 检查点算法

上检查点刷新WAL 首先, 使用xsync 持久存储的方法VFS 然后有效WAL 传递到数据库中文件的内容最后, 该数据库已被另一个程序使用的条目数持久存储使用xsync 方法调用在您的xsync 操作作为写入栅-所有通用属性之前, 必须首先完成xsync 在xsync 开始运行之后的所有写入一个文件

在每次检查点, WAL 页眉salt-1 值增加和salt-2 值为randomized这将防止新旧帧WAL 被认为是有效的很长的时间和操作在一起了下列一个崩溃

44 读取器算法

从数据库中要读取页(页码p) 调用它, 一个读卡机首先检查WAL 以查看它包含的页p如果是这样的话, 那么最后的有效网页p实例其后是提交框架或提交框架中的控件读取的值第p页, 如果WAL 不包含任何有效, 并且它们是提交框架或后跟一个提交框架然后是从数据库中读取的第&&p页

要启动一个读取事务, 这是个记录在WAL 最后的有效框架的索引读取器使用此类录制的"mxframe "选项"对话框的"常规"选项卡的所有后续读取操作新事务可以附加到WAL但是只要读取器将使用其原始mxframe 值并忽略随后附加内容读取器将看到一个一致的数据库从单点在特定时间的快照此技术允许多个并发读者可同时查看不同版本的数据库内容

读取器算法在前面的单词是否工作正常但是, 因为第p页可以出现在WAL 任意的框架无法读取器, 扫描整个WAL 要查看的页p帧如果WAL 是大型(多个兆字节是典型值), 手动扫描速度可能较慢, 并读取性能解决这个问题, 一个单独的数据结构图调用wal-index 是维护的并发性搜索特定页的帧

45 WAL-Index 格式

从概念上讲, 到的wal-index 是共享的内存, wal-index 当前VFS 实现使用mmapped 文件为: mmapped 文件不在同一个目录作为数据库和具有相同的名称作为具有"数据库-shm "后缀附加由于wal-index 是共享的内存, SQLite 不支持journal_mode=WAL 在网络上文件系统当客户机安装在不同的计算机上所有用户的数据库必须能共享相同的内存

在wal-index 的目的在于快速这个问题的答案:

给定的页码p和最大WAL 框架中的索引m, m, 返回最大的WAL 框架索引中的页p, 并且不超过m, m, 或返回NULL 如果没有框架的页pm.不要超过

"m在下一段的值为"mxframe "〗中定义的第5节4可被在事务开始处然后从WAL , 它定义了这个最大帧读取器将使用的端点

wal-index 是暂时的在崩溃之后, 角落wal-index 是从原始WAL 文件所要求的VFS 截断或零头的wal-index 当它关闭前一次连接由于wal-index 是暂时的, 它使用了architecture-specific 格式;它不一定要跨平台因此, 使用数据库和WAL 文件格式存储所有的值作为高位字节在前的多字节的值, wal-index 存储在本机字节顺序的主机

此文档有文持久状态该数据库文件和wal-index 是瞬态结构关于wal-index 的格式没有更多的信息将不会被记录到此处完整详细信息在要设置格式的wal-index 都包含在注释中的SQLite 源代码

你可能感兴趣的:(框架,数据库,sqlite,table,存储,文档)