1. 页面格式
页面由页头,cell索引数组(排序好的),未利用空闲,cell,reserve构成,具体见下面几张图
2. cell格式
如下图所示
3.payload格式
第一个字节叫做header size,每张表都由字段类型和具体的内容组成,这个字节规定了属于字段类型的长度,每一种类型对应的格式如下图所示,注意这里是用奇偶数来区分blob类型还是string类型
4.样例分析
测试脚本如下
file delete -force example1.db
sqlite3 db example1.db
db eval {
PRAGMA vdbe_trace = 1}
db eval {
CREATE TABLE t1(a TEXT, b INTEGER)}
db eval {
CREATE INDEX i1 ON t1(a);
INSERT INTO t1 VALUES('one',1);
INSERT INTO t1 VALUES('two',2);
INSERT INTO t1 VALUES(NULL,2);
}
db eval {
SELECT * FROM t1 } {
puts "a=$a b=$b"
}
db close
数据库页面大小设置的是1024字节,insert的内容存在第2页,共3个单元,如下图所示
每个字节的含义见表格,header size表示类型个数,如果header size为x,则类型有x-1个
内容长度 | key值 | header size | 类型a | 类型b | a | b |
---|---|---|---|---|---|---|
4 | 3 | 3 | 0 | 1 | / | 2 |
7 | 2 | 3 | 0x13 | 1 | two | 2 |
6 | 1 | 3 | 0x13 | 9 | one | / |
5.第一个cell是怎么插进去的
在insertCell函数里
memcpy(&data[idx], pCell, sz);
6.参考资料
《SQLite Database System Design and Implementation》p162-p164
SQLite数据库文件格式逐字节详解
Database File Format