存储类比数据类型更通用。例如,INTEGER存储类包括7种不同长度的整数数据类型。这在磁盘上产生了影响。但是,一旦INTEGER值从磁盘读取到内存中进行处理,它们就会被转换为最通用的数据类型(8字节有符号整数)。因此,在大多数情况下,“存储类”与“数据类型”无法区分,这两个术语可以互换使用。
SQLite版本3数据库中的任何列(INTEGER PRIMARY KEY列除外)都可以用于存储任何存储类的值。
SQL语句中的所有值,无论是嵌入在SQL语句文本中的文字还是绑定到预编译SQL语句的参数,都有一个隐式存储类。在下面描述的情况下,数据库引擎可以在查询执行期间在数值存储类(INTEGER和REAL)和TEXT之间转换值。
Boolean 数据类型
SQLite没有单独的布尔存储类。相反,布尔值存储为整数0(false)和1(true)。
SQLite从3.23.0版本(2018-04-02)开始识别关键字“TRUE”和“FALSE”,但这些关键字实际上只是整数文字1和0的替代拼写。
日期和时间数据类型
SQLite没有专门用于存储日期和/或时间的存储类。相反,SQLite的内置日期和时间函数能够将日期和时间存储为TEXT、REAL或INTEGER值:
文本为ISO8601字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。
真正的Julian历日数,根据保守的格里高利历,自公元前4714年11月24日格林尼治中午以来的天数。
INTEGER表示Unix时间,自1970-01-01 00:00:00 UTC以来的秒数。
应用程序可以选择以这些格式中的任何一种存储日期和时间,并使用内置的日期和时间函数在格式之间自由转换。
使用刚性类型的SQL数据库引擎通常会尝试自动将值转换为适当的数据类型。考虑一下:
CREATE TABLE t1(a INT, b VARCHAR(10));
INSERT INTO t1(a,b) VALUES('123',456);
在执行插入操作之前,严格类型的数据库会将字符串“123”转换为整数123,将整数456转换为字符串“456”。
为了最大限度地提高SQLite和其他数据库引擎之间的兼容性,并使上面的示例在SQLite上像在其他SQL数据库引擎上一样工作,SQLite支持列上的“类型亲和性”概念。列的类型相关性是存储在该列中的数据的推荐类型。这里的重要思想是,该类型是推荐的,而不是必需的。任何列仍然可以存储任何类型的数据。只是有些列在有选择的情况下,会更喜欢使用一个存储类而不是另一个。列的首选存储类称为“亲和性”。
SQLite 3数据库中的每一列都被分配了以下类型亲和性之一: