由于SQLite可以在任何列中存储任何数据,我的问题是SQLite引擎如何知道哪个是哪个?
假设一个表有列a,并且有两个值123和"#$%"。这两个是如何存储的(我想知道逐字节的布局来理解(?
如果我执行select * from table where a > 0
,这些值会发生什么?
显然,引擎需要计算出A列中的每个值类型。它到底是如何做到的?
它是否为每个值存储一个类型标记,以便在选择时检查标记?还是每次检索值时都评估类型
有一个类型标记,称为串行类型。它是一个可变长度的整数,对值的类型和长度进行编码。
NULL
、0、1和"(空文本(需要1个字节(串行类型为1个字节,无值(
整数需要2到9个字节(1个字节的串行类型,1到8个字节的值(,因此123需要2个字节。
对于文本值,串行类型可以扩展到多个字节。假设UTF-8,'#$%'
需要4个字节(1个字节的串行类型,因为编码长度<=57(
数据库文件格式中有更多详细信息。