嘿,我正试着把我的注意力集中在SQLite数据存储上,特别是它是如何存储记录的。我找到了一本书SQLlite的最终指南,其中作者解释了内部记录格式(图9-5,第351页):
给定表:
sqlite> SELECT * FROM episodes ORDER BY id LIMIT 1;
id season name
--- ------ --------------------
0 1 Good News Bad News其内部记录格式如下:
| 04 | 01 | 01 | 49 | | 00 | 01 | Good News Bad News |标题长4字节。标题大小反映了这一点,并将其本身编码为单个字节。第一种类型对应于id字段,为1字节有符号整数。第二种类型对应于季节字段。名称类型条目为奇数,意味着它是一个文本值。因此,它的大小由(49-13)/2=18字节指定。
具体来说,我对TEXT属性很好奇,在上面的示例中,我们有一个长度为18个字符的字符串。TEXT在SQLite中的规则如下:
Type Value Meaning Length of Data
---------- ------- --------------------
N>13 and odd TEXT (N-13)/2当绳子变长的时候,会有什么问题呢?它会超出一个字节的范围。
发布于 2020-03-05 18:25:31
书中的作者要么描述了一些非常古老的SQLite版本,要么他们说“header大小被编码为一个字节”时犯了一个错误。
“描述和定义自3.0.0版(2004-06-18版)以来所有版本的文档所使用的磁盘上数据库文件格式”的C0声明如下:
记录格式广泛使用64位有符号整数的可变长度整数或varint表示。The头以一个varint开头,它确定标题中的总字节数。后面是一个或多个额外的变量,每列一个。
而
可变长度整数或"varint“是64位双补整数的静态Huffman编码,它使用较少的空间来处理小的正值。varint的长度在1到9字节之间。
所以
用于大型字符串和BLOB的串行类型varint可能扩展到两个或三个字节变量。
这使得它们可以表示相当长的值。
https://dba.stackexchange.com/questions/261302
复制相似问题