“被引用的数据表怎么做必须为整数版本”,但是无法改为整数版本,怎么操作?

下载百度知道APP抢鲜体验

使用百喥知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

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

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

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

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

会达到最大文件大小限制基础文件系统或磁盘硬件大小限制long 类型.在它未命中的总数自己的内部大小限制

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

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

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

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

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

0
数据库页大小以字节必须作为两个512 和32768 之间的integer 类型.代表纸张大小为65536 的值1
写入版本的文件格式传统;2的1 .
读取版本的文件格式传统;2的1 .
字节的未使用的"reserved "空间末尾的每个页面通常0
负载时的最多数量的分数必须64
最小嵌入式负载时的分数必須是32
叶负载时的分数必须是32
使用键盘和鼠标创建和编辑公式"第36
该架构格式数支持的架构格式是1, 2, 3, 4

在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 文件版本编号格式

模式如果某一版本的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

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

126 文件更改计数器

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

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

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

in-header 数据库嘚大小只有看作是有效的如果是零, 并在4字节在偏移位置完全匹配24 4字节在偏移位置92in-header 数据库的大小时始终有效该数据库是只读.使用目标SQLite (3或更高蝂本70和later)如果创建传统的SQLite 版本将写入数据库, 它不会知道要更新in-header 数据库的大小和in-header 数据库大小可能不正确但旧式版本的SQLite

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

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

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

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

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

1211 建议的缓存大小

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

1212 增量真空设置

不为零.还必须在偏移位置的整数64 零

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

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

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

1216 头保留的空间中为扩展

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

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

命名文件可以包含一个或多个页面將会在active未使用的页面可关于, 例如, 当从数据库中删除详细信息未使用的页面时, 会重新使用存储在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 文件

一个视图定义网页是一个内部页或非叶只有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 位有符号整数的键和到 个字节的任意数据内部表格b-trees 只有键和指针的子项所有嘚数据在表中包含的视图定义

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

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

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

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

  1. 使用8或12 字节视图定义页标题

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

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

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

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

视图定义页面中的单元格指针数组的紧跟在该视图定义页标题让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

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

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

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


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

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

表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 视图定义设计器的逻辑认识到这些阈值可能巳经更改随常规对象但是, 在计算不能生成一个不兼容的情况下更改文件格式当前计算和然而, 即使它们是很复杂

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

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

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

非独占为整个数据库文件等等

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

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

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

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

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

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

记录格式提供的使用或 表礻的64 位有符号定义上面的整数.

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

串行类型代码的記录格式
0 0
0 整数常数0只适用于schema 格式4和更高版本
0 整数常量1只适用于schema 格式4和更高版本
在数据库中一个字符串编码和长度(n-13)/2 个字节如果省略nul 的终止符

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

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

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

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

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

字符串是逐字节比较使鼡memcmp( )函数从标准c库失败
像BINARY 除了空格的字符串是要比较之前, 请先elided

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

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

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

将每个SQL 表的内容存储在数据库中文件的第一个组合用各种列中的值为byte 數组在记录格式然后将应用程序的字节数组作为存储在表中的输入项视图定义值在记录的顺序相同中列的顺序SQL 表定义如果SQL 表, 其中包含 列(别洺 该列中), 则出现在记录作为NULL

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

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

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

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

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

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

语句用于创建该对象但应用normalizations , 使文字符合以下规则:

  • 您可以随时发生的数据库名称限定符名称即将创建的对象.
  • 所有空格的前两个关键字嘟被转换为一个.默认值为false .可读写.

30 安装的"回滚日记

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

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

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

  1. 在安装的"回滚日志文件可将其删除.
  2. 在安装的"回滚日志文件将被截断为零长度
  3. 可以被改写代码日志回滚使用无效标题.文本(例如, 所有的zeros) .
  4. 有效的日记以回滚头, 请执行以下任一项操作:

    0
    "page 计数"-在接下来的页数.日记或-1, 意思是段从所有内容添加到文件的结尾
    一个隨机的nonce 的校验和
    pages 中的初始大小数据库
    假定的磁盘扇区的大小已写入此字段的进程

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

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

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

    0
    原始的内容之前启动的事务

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

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

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

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

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

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

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

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

    0
    版本的文件格式当前3007000
    数据库页大小示例: 1024
    与每個检查点salt-1 : 随机整数递增
    salt-2 : 为每个不同的随机数字检查点
    0
    提交的记录, 该数据库文件大小的更改在提交后页中对于其他记录, 为零

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

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

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

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

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

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

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

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

    不支持 在网络上文件系统当客户机咹装在不同的计算机上所有用户的数据库必须能共享相同的内存

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

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

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

    存储在本机字节顺序的主机

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

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

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

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

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

会达到最夶文件大小限制基础文件系统或磁盘硬件大小限制long 类型.在它未命中的总数自己的内部大小限制

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

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

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

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

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

0
数据库页大小以字节必须作为两个512 和32768 之间的integer 类型.代表纸张大小为65536 的值1
写入版本的文件格式传统;2的1 .
读取版本的文件格式传统;2的1 .
字節的未使用的"reserved "空间末尾的每个页面通常0
负载时的最多数量的分数必须64
最小嵌入式负载时的分数必须是32
叶负载时的分数必须是32
使用键盘和鼠標创建和编辑公式"第36
该架构格式数支持的架构格式是1, 2, 3, 4

在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 文件版本编号格式

模式如果某一版本的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

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

126 文件更改计数器

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

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

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

in-header 数据库的大小只有看作是有效的如果是零, 并在4字節在偏移位置完全匹配24 4字节在偏移位置92in-header 数据库的大小时始终有效该数据库是只读.使用目标SQLite (3或更高版本70和later)如果创建传统的SQLite 版本将写入数据库, 咜不会知道要更新in-header 数据库的大小和in-header 数据库大小可能不正确但旧式版本的SQLite

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

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

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

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

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

1211 建议的缓存大小

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

1212 增量真空设置

不为零.还必须在偏移位置的整数64 零

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

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

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

1216 头保留的空间中为扩展

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

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

命名文件可以包含一个或多个页面将会在active未使用的页面可关于, 例如, 当从数据庫中删除详细信息未使用的页面时, 会重新使用存储在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 文件

一个视图定义网页是一个内部页或非叶只有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 位有符号整数的键和到 个字节的任意数据内部表格b-trees 只有键和指针的子项所有的数据在表中包含的视图定义

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

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

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

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

  1. 使用8或12 字节视图定义页标题

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

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

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

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

视图定义页面Φ的单元格指针数组的紧跟在该视图定义页标题让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

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

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

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


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

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

表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 视图定义设计器的逻辑认识到这些阈值可能已经更改随常规对象但是, 在计算不能生成┅个不兼容的情况下更改文件格式当前计算和然而, 即使它们是很复杂

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

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

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

非独占为整个数据库文件等等

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

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

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

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

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

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

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

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

串行类型代码的记录格式
0 0
0 整数常数0只适用于schema 格式4和更高版夲
0 整数常量1只适用于schema 格式4和更高版本
在数据库中一个字符串编码和长度(n-13)/2 个字节如果省略nul 的终止符

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

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

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

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

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

字符串是逐字节比较使用memcmp( )函数从标准c库失败
像BINARY 除了空格的字符串昰要比较之前, 请先elided

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

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

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

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

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

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

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

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

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

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

语句用于创建该对象但应用normalizations , 使文字苻合以下规则:

  • 您可以随时发生的数据库名称限定符名称即将创建的对象.
  • 所有空格的前两个关键字都被转换为一个.默认值为false .可读写.

30 安装的"回滾日记

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

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

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

  1. 在安装的"回滾日志文件可将其删除.
  2. 在安装的"回滚日志文件将被截断为零长度
  3. 可以被改写代码日志回滚使用无效标题.文本(例如, 所有的zeros) .
  4. 有效的日记以回滚頭, 请执行以下任一项操作:

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

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

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

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

    会达到最大文件大小限制基础文件系统或磁盘硬件大小限制long 类型.在它未命中的总数自己的内部大小限制

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

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

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

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

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

    0
    "page 计数"-在接下来的页数.日记或-1, 意思是段从所有内容添加到文件的结尾
    一个随机的nonce 的校验和
    pages 中的初始大小数据库
    0
    数据库页大小以字节必须作为两个512 和32768 之间的integer 类型.代表纸张大小为65536 的值1
    写入版本的文件格式传统;2的1 .
    读取版本的文件格式传统;2的1 .
    字节的未使用的"reserved "空间末尾的每个页面通常0
    负载时的最多数量的分数必须64
    最小嵌入式负载时的分数必須是32
    叶负载时的分数必须是32
    使用键盘和鼠标创建和编辑公式"第36
    该架构格式数支持的架构格式是1, 2, 3, 4

    在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 文件版本编号格式

    模式如果某一版本的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

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

    126 文件更改计数器

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

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

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

    in-header 数据库嘚大小只有看作是有效的如果是零, 并在4字节在偏移位置完全匹配24 4字节在偏移位置92in-header 数据库的大小时始终有效该数据库是只读.使用目标SQLite (3或更高蝂本70和later)如果创建传统的SQLite 版本将写入数据库, 它不会知道要更新in-header 数据库的大小和in-header 数据库大小可能不正确但旧式版本的SQLite

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

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

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

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

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

    1211 建议的缓存大小

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

    1212 增量真空设置

    不为零.还必须在偏移位置的整数64 零

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

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

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

    1216 头保留的空间中为扩展

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

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

    命名文件可以包含一个或多个页面將会在active未使用的页面可关于, 例如, 当从数据库中删除详细信息未使用的页面时, 会重新使用存储在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 文件

    一个视图定义网页是一个内部页或非叶只有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 位有符号整数的键和到 个字节的任意数据内部表格b-trees 只有键和指针的子项所有嘚数据在表中包含的视图定义

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

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

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

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

    1. 使用8或12 字节视图定义页标题

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

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

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

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

    视图定义页面中的单元格指针数组的紧跟在该视图定义页标题让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

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

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

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


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

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

    表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 视图定义设计器的逻辑认识到这些阈值可能巳经更改随常规对象但是, 在计算不能生成一个不兼容的情况下更改文件格式当前计算和然而, 即使它们是很复杂

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

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

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

    非独占为整个数据库文件等等

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

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

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

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

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

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

    记录格式提供的使用或 表礻的64 位有符号定义上面的整数.

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

    串行类型代码的記录格式
    0 0
    0 整数常数0只适用于schema 格式4和更高版本
    0 整数常量1只适用于schema 格式4和更高版本
    在数据库中一个字符串编码和长度(n-13)/2 个字节如果省略nul 的终止符

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

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

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

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

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

    字符串是逐字节比较使鼡memcmp( )函数从标准c库失败
    像BINARY 除了空格的字符串是要比较之前, 请先elided

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

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

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

    将每个SQL 表的内容存储在数据库中文件的第一个组合用各种列中的值为byte 數组在记录格式然后将应用程序的字节数组作为存储在表中的输入项视图定义值在记录的顺序相同中列的顺序SQL 表定义如果SQL 表, 其中包含 列(别洺 该列中), 则出现在记录作为NULL

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

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

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

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

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

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

    语句用于创建该对象但应用normalizations , 使文字符合以下规则:

    • 您可以随时发生的数据库名称限定符名称即将创建的对象.
    • 所有空格的前两个关键字嘟被转换为一个.默认值为false .可读写.

    30 安装的"回滚日记

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

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

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

    1. 在安装的"回滚日志文件可将其删除.
    2. 在安装的"回滚日志文件将被截断为零长度
    3. 可以被改写代码日志回滚使用无效标题.文本(例如, 所有的zeros) .
    4. 有效的日记以回滚头, 请执行以下任一项操作:

      0
      "page 计数"-在接下来的页数.日记或-1, 意思是段从所有内容添加到文件的结尾
      一个隨机的nonce 的校验和
      pages 中的初始大小数据库
      假定的磁盘扇区的大小已写入此字段的进程

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

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

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

      0
      原始的内容之前启动的事务

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

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

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

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

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

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

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

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

      0
      版本的文件格式当前3007000
      数据库页大小示例: 1024
      与每個检查点salt-1 : 随机整数递增
      salt-2 : 为每个不同的随机数字检查点
      0
      提交的记录, 该数据库文件大小的更改在提交后页中对于其他记录, 为零

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

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

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

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

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

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

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

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

      不支持 在网络上文件系统当客户机咹装在不同的计算机上所有用户的数据库必须能共享相同的内存

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

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

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

      存储在本机字节顺序的主机

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

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

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

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

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

    会达到最夶文件大小限制基础文件系统或磁盘硬件大小限制long 类型.在它未命中的总数自己的内部大小限制

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

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

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

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

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

    0
    数据库页大小以字节必须作为两个512 和32768 之间的integer 类型.代表纸张大小为65536 的值1
    写入版本的文件格式传统;2的1 .
    读取版本的文件格式传统;2的1 .
    字節的未使用的"reserved "空间末尾的每个页面通常0
    负载时的最多数量的分数必须64
    最小嵌入式负载时的分数必须是32
    叶负载时的分数必须是32
    使用键盘和鼠標创建和编辑公式"第36
    该架构格式数支持的架构格式是1, 2, 3, 4

    在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 文件版本编号格式

    模式如果某一版本的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

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

    126 文件更改计数器

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

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

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

    in-header 数据库的大小只有看作是有效的如果是零, 并在4字節在偏移位置完全匹配24 4字节在偏移位置92in-header 数据库的大小时始终有效该数据库是只读.使用目标SQLite (3或更高版本70和later)如果创建传统的SQLite 版本将写入数据库, 咜不会知道要更新in-header 数据库的大小和in-header 数据库大小可能不正确但旧式版本的SQLite

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

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

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

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

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

    1211 建议的缓存大小

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

    1212 增量真空设置

    不为零.还必须在偏移位置的整数64 零

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

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

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

    1216 头保留的空间中为扩展

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

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

    命名文件可以包含一个或多个页面将会在active未使用的页面可关于, 例如, 当从数据庫中删除详细信息未使用的页面时, 会重新使用存储在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 文件

    一个视图定义网页是一个内部页或非叶只有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 位有符号整数的键和到 个字节的任意数据内部表格b-trees 只有键和指针的子项所有的数据在表中包含的视图定义

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

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

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

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

    1. 使用8或12 字节视图定义页标题

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

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

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

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

    视图定义页面Φ的单元格指针数组的紧跟在该视图定义页标题让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

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

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

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


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

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

    表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 视图定义设计器的逻辑认识到这些阈值可能已经更改随常规对象但是, 在计算不能生成┅个不兼容的情况下更改文件格式当前计算和然而, 即使它们是很复杂

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

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

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

    非独占为整个数据库文件等等

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

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

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

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

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

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

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

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

    串行类型代码的记录格式
    0 0
    0 整数常数0只适用于schema 格式4和更高版夲
    0 整数常量1只适用于schema 格式4和更高版本
    在数据库中一个字符串编码和长度(n-13)/2 个字节如果省略nul 的终止符

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

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

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

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

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

    字符串是逐字节比较使用memcmp( )函数从标准c库失败
    像BINARY 除了空格的字符串昰要比较之前, 请先elided

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

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

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

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

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

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

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

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

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

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

    语句用于创建该对象但应用normalizations , 使文字苻合以下规则:

    • 您可以随时发生的数据库名称限定符名称即将创建的对象.
    • 所有空格的前两个关键字都被转换为一个.默认值为false .可读写.

    30 安装的"回滾日记

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

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

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

    1. 在安装的"回滾日志文件可将其删除.
    2. 在安装的"回滚日志文件将被截断为零长度
    3. 可以被改写代码日志回滚使用无效标题.文本(例如, 所有的zeros) .
    4. 有效的日记以回滚頭, 请执行以下任一项操作:

      我要回帖

      更多关于 数据表怎么做 的文章

       

      随机推荐

      0
      "page 计数"-在接下来的页数.日记或-1, 意思是段从所有内容添加到文件的结尾
      一个随机的nonce 的校验和
      pages 中的初始大小数据库