SQLite数据库文件格式
数据库命名约定
sqlite3_open()API用到数据库的文件名,可以是相对当前工作目录的相对路径名,也可以是从系统根文件树开始的完整路径名。任何被本地文件系统接受的正规文件名都是好的。
如果文件名是C语言中的NULL指针(即,0),SQlite创建并打开一个临时文件。如果文件名是内存地址,SQLite创建一个内存数据库。在这两种情况中,当应用程序关闭数据库时,数据库都会被消灭,即数据库不是持久的。SQLite随机选择临时文件名(以sqlite_开头,后跟16位字母数字随机串)。文件尝试在以下目录存储,(1) /var/tmp, (2) /usr/tmp, (3) /tmp, (4) 当前工作目录。不管是什么方式打开的数据库(文件数据库,临时数据库,内存数据库),在SQLite内部都被命名为主数据库(main database)。
在内部,数据库文件名不是数据库名。他们是相关但是不同的概念。用attach命令,可以把一个数据库文件以不同的数据库别名关联到一个数据库连接上。可以通过这些别名访问数据库文件。
当应用程序用sqlite3_open()打开数据库时,SQLite会为每一个连接维护一个单独的临时数据库。临时数据库存储临时对象(表及其索引)。应用程序可以在其查询中用这两个名称(main和temp),例select * from temp.table1返回在临时数据库中表1的所有行,而不是主数据库中的。临时数据库的catalog名是sqlite_temp_master。临时对象只在相同的数据库连接内才是可见的,在对相同数据库的不同的连接是不可见的,即使是同一个线程,进程或是程序。SQlite把临时数据库存储在一个与主数据库文件不同的单独的临时文件中。当应用程序关闭到主数据库的连接时,会删除这个临时文件。
数据库文件系统
除了内存数据库,SQLite存储一整个数据库(main或temp)在一个单独的页中。
页:为了方便空间按管理,SQLite把数据库(包括内存数据库)划分成固定大小的区域,称为数据库的页(页大小为2的幂次方,从512到32768,默认1024。上界是由在代码中或在外部存储中的2字节的有符号整数确定的)。数据库是由页的数组(可扩大或缩小)组成的,数组的下标称为是页号,下标从1开始直到231 -1结束(上界由本地文件系统的最大文件长度确定)。第0页被作为没有此页或不是个页对待,总之是物理上不存在的页。第1页以及以后的页都是依次从数据库文件偏移量为0的位置开始排列。
一旦创建了数据库文件,SQLite采用默认的也大小,但是在创建第一个表之前,也可通过编译命令改变页大小。SQlite把页大小作为元数据的一部分来存储。将会用这个值代替默认的页大小(编译命令用来改变数据库的行为特性)。
页类型:有四种页:叶子页,内部页,溢出叶,自由页。自由页是无效(当前未被使用),其他的都是活跃的页。
B+树内部页有搜索导航信息,叶子页存储实际的数据(表中的行),如果一行信息量太大不能放入一个页中,则部分数据存入叶子页中,剩余的存在溢出页中。
B树有内部页有搜索信息和数据。
文件头:SQLite可以把任何页类型用于任何数据库页,除了第1页,它总是B+树的内部页。在该页0偏移地址处存储了100字节的文件头记录,文件头记录描述了数据库文件的数据结构。SQLite在建立一个数据库文件时初始化文件头。
| Ofset | Size | Description | |
| 0 | 16 | Header string | 16字节字符串 "SQLite format 3." |
| 16 | 2 | Page size in bytes | 本数据库各个页的大小. |
| 18 | 1 | File format write version | 这两个字节表示该文件格式的版本。在当前版本中,两字节都为1,否则会返回错误。如果未来文件格式变化,数字会增长以表示新的文件格式版本号 |
| 19 | 1 | File format read version | 同上 |
| 20 | 1 | Bytes reserved at the end of each page | 在每一页结束的地方SQLite为其自己目的存储(<=255字节)内容,默认值是0,如果是非0值,则SQLite用内嵌的加密方式加密,页面的前半部分(从页面尺寸-保留尺寸)是可用的,数据内容在前半部分存储。 |
| 21 | 1 | Max embedded payload fraction | 在B/B+树内部节点中的单条记录的最大可用空间,最大值是255,默认值是64(一页能装4条记录)。如果记录太大,则尽可能的把多余信息放到溢出页中,从而使得内部节点的记录大小在最小可用空间(下一项内容,默认32)之上。 |
| 22 | 1 | Min embedded payload fraction | |
| 23 | 1 | Min leaf payload fraction | 叶子节点最小的可用空间,默认32,能存8个。默认最大255但是并未在头信息中声明出来。B树中没有特殊用途的叶子节点。 |
| 24 | 4 | File change counter | 被事务调用,每一个事务都会使得值增加。这个值是当数据库变化时,页管理器不刷新其缓存。 |
| 28 | 4 | Reserved for future use | |
| 32 | 4 | First freelist page | 未被使用的页面的的列表。分两种页面,主干页和叶子页。当页面处在非活动状态时,页面被放入列表,系统并不会释放页面,当要用时,SQLite取出页在去存储信息。如果列表为空,则从本地文件系统再获得新页,并加到数据库文件。 |
| 36 | 4 | Number of freelist pages | 未被使用的页的数目。 |
| 40 | 60 | 15 4-byte meta values | 元数据,存储了很多的元变量。文件格式信息,架构信息等,编码信息。 |
这些内容都是大端存储的,可移植性较高。
SQLite数据库文件格式的更多相关文章
- SQLite数据库学习小结——native层实现
1. SQlite概述 SQLite是一款轻量.快速.跨平台的嵌入式数据库,是遵守ACID(注:ACID指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consi ...
- 我的Android六章:Android中SQLite数据库操作
今天学习的内容是Android中的SQLite数据库操作,在讲解这个内容之前小编在前面有一篇博客也是讲解了SQLite数据库的操作,而那篇博客的讲解是讲述了 如何在Window中通过DOM来操作数据库 ...
- SQLite数据库的体系结构(翻译自sqlite.org)
$1 简介 本文档描述了SQLite库的体系结构,这些信息对那些想理解和修改SQLite的内部工作机制的人是有用的. 下图显示了SQLite的主要组成部件及其相互关系,下面的内容将描述每一 ...
- Android 之Navicat for SQLite 数据库介绍
Navicat for SQLite 是一套专为SQLite 设计的强大数据库管理及开发工具 Navicat for SQLite 是一套专为SQLite 设计的强大数据库管理及开发工具.它可以 ...
- Android之SQLite数据库篇
一.SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大. 二.SQLite的特点 1.轻量级使用 SQLit ...
- Qt5 开发 iOS 应用之访问 SQLite 数据库
开发环境: macOS 10.12.1 Xcode 8.1 Qt 5.8 iPhone 6S+iOS 10.1.1 源代码: 我在 Qt 程序里指定了数据库的名称来创建数据库,在 Win10.An ...
- 【Win 10 应用开发】Sqlite 数据库的简单用法
如果老周没记错的话,园子里曾经有朋友写过如何在 UWP 项目中使用 Sqlite数据库的文章.目前我们都是使用第三方封装的库,将来,SDK会加入对 Sqlite 的支持. 尽管目前 UWP-RT 库中 ...
- Android之SQLite数据库使用
转载整理于:http://my.csdn.net/lmj623565791 我刚开始接触Android的时候甚至都不敢相信,Android系统竟然是内置了数据库的!好吧,是我太孤陋寡闻了.由于我之前是 ...
- 让PDF.NET支持最新的SQLite数据库
最近项目中用到了SQLite,之前项目中用的是PDF.NET+MySQL的组合,已经写了不少代码,如果能把写好的代码直接用在SQLite上就好了,PDF.NET支持大部分主流的数据库,这个当然可以,只 ...
随机推荐
- 如何在Eclipse中设置默认的JSP文件头部编码
如何在Eclipse中设置默认的JSP文件头部编码 一般,我们为了以后在导入和导出程序的时候(特别是项目较大,文件多)一般都默认文件编码格式为UTF-8 如果你通常都是通过Eclipse来编写程序,那 ...
- java 读取文件最佳实践
1. 前言 Java应用中很常见的一个问题,如何读取jar/war包内和所在路径的配置文件,不同的人根据不同的实践总结出了不同的方案,但其他人应用却会因为环境等的差异发现各种问题,本文则从原理上解释 ...
- 上下margin重叠传递问题
我发现强迫症真的是我一个大病...每次都非得把所有情况都实验出来不可...BUT!!!!!!!!!悲催的是,这么多情况我根本记不住...还是要在写代码的时候不断出错再排错~受不了自己了!不过还是把这部 ...
- Erlang 101 Erlang环境和顺序编程
笔记系列 Erlang环境和顺序编程 Erlang并发编程 Erlang分布式编程 Yaws Erlang/OTP 日期 变更说明2014-10-12 A outline, ...
- 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
腾讯优测是专业的android自动化测试平台,拥有上千款真机,彻底解决android碎片化问题! 这里我要说的不是闪光灯的硬件特征,也不是说底层驱动的原理,我只是跟大家聊一聊在项目中遇到的一些关于闪光 ...
- Java初学者入门应该掌握的30个概念
1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构 是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why.所有的程序是由一 ...
- 在Eclipse中配置Tomcat服务器
第一步:开启Eclipse,选择“servers”选项卡,点击下方新建server的链接. 如果找不到“server”选项卡,可以使用以下方法: 选择window--> show View -- ...
- POJ 1094 (TopoSort)
http://poj.org/problem?id=1094 题意:该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列.是典型的拓扑排序,但输出格式上确有三种形式: 1.该字母序 ...
- 黑马程序员——JAVA基础之网络编程
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 网络编程 网络模型:OSI参考模型和TCP/IP参考模型 网络通讯三要素: IP地址:InetA ...
- 不同操作系统上屏蔽oracle的操作系统认证方式
windows系统上>如果不想用户通过操作系统验证方式登录,可以修改 sqlnet.ora文件,把 SQLNET.AUTHENTICATION_SERVICES=NTS 前面加#注释掉就可以了. ...