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支持大部分主流的数据库,这个当然可以,只 ...
随机推荐
- 【第一篇】Android环境搭建
安装不易,且安且珍惜! 1 下载 Java JDK (http://java.sun.com/javae/downloads/ ) (Windows 版) [配置环境变量]:安装完成后,设置JAVA_ ...
- sql datetime操作
Sql Server中的日期与时间函数 SQL中的时间函数非常有用,特别是在我们进行初始赋值.复杂查询的时候,就显得特别方便. 1.获得系统当前时间 select getdate() 2.DateN ...
- php大力力 [041节] 今天没有写日志哈
php大力力 [041节] 今天没有写日志哈 如何下拉,左边的side颜色 能顺延下去?? 今天做了一个表格显示
- 模版页面通过get传参数http://.../good_id/2;控制中可以直接使用echo $good_id;//2
- HDU 4734 F(x)
这题可能非递归版好写? #include<iostream> #include<cstdio> #include<cstring> #include<algo ...
- supervisor安装配置与使用
supervisor:C/S架构的进程控制系统,可使用户在类UNIX系统中监控.管理进程.常用于管理与某个用户或项目相关的进程. 组成部分supervisord:服务守护进程supervisorctl ...
- React Native交互组件之Touchable
React Native交互组件之Touchable:只要在组件外面包一个Touchable组件就可以实现点击交互. TouchableHighlight:高亮触摸 当点击时,组件的透明度会改变,可以 ...
- Python培训12期-day2作业-购物车
#!/usr/bin/env python import sys import os import getpass 商品={ '图书': { "<Puppet实战>": ...
- Socket编程基础——面向连接TCP
WinSock是Windows环境下的网络编程接口,它最初是基于Unix环境下的BSD Socket,是一个与网络协议无关的编程接口.WinSock包含两个主要版本,即WinSock1和WinSock ...
- 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
腾讯优测是专业的android自动化测试平台,拥有上千款真机,彻底解决android碎片化问题! 这里我要说的不是闪光灯的硬件特征,也不是说底层驱动的原理,我只是跟大家聊一聊在项目中遇到的一些关于闪光 ...