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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值