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支持大部分主流的数据库,这个当然可以,只 ...
随机推荐
- innerHTML,innertext ,textcontent,write()
innerhtml属于对象的一个属性,一般用于向已经存在的标签中写入内容,或者读取标签的内容. innertext属于对象的一个属性,一般只能用于写入内容,或者读取内容,不能读取dom 中的标签,且只 ...
- android:LayoutInflater
LayoutInflater:一般用于查找res/layout下的布局文件,findViewById()一般是用于查找布局下的各种控件 一般:我们使用LayoutInflater.from(conte ...
- Notification NotificationManager RemoteViews PendingIntent
Notification和NotificationManager :可以用来实现可视化的消息通知等,比如:下载进度显示,消息显示,广播的内容等 RemoteViews :用于创建自定义的Notific ...
- hasLayout与BFC的触发条件
hasLayout与BFC是分别在IE和其他浏览器上的两个作用很相近的概念,在很多时候,我们需要触发它们去实现有些效果.例如清除浮动时需要触发hasLayout与BFC:很多自适应的两栏和三栏布局(两 ...
- 黑马程序员:Java编程_泛型
=========== ASP.Net+Android+IOS开发..Net培训.期待与您交流!=========== 没有使用泛型时,只要是对象,不管是什么类型的对象,都可以存储进同一个集合中.使用 ...
- Application.Exit()结束程序,但线程还在的解决方法。
出现此情况大多原因是使用了多线程编程,或者你所调用的dll使用了多线程.我们知道,一般情况下的线程执行完指定的任务之后是会关闭了的,但是如果对于一些循环类线程,或者忘记关掉的线程时,这个时候就需要我们 ...
- 使用Timer类的两个实例 动态时钟
package chapter16; import javax.swing.*; import chapter15.StillClock; import java.awt.event.*; publi ...
- android studio Keymap快捷键
android studio整理代码格式的快捷键 在设置里面看 File-->Setting-->Keymap-->Reformat Code 或者在Keymap右上的搜索栏搜 Re ...
- Oracle建表添加数据
- 导航代码position:relative
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...