SQLite 数据类型概述
SQLite 采用动态类型系统,数据类型由值本身而非列定义决定。列的类型声明仅为"类型亲和性"(Type Affinity),用于指导数据存储方式。以下是 SQLite 支持的核心数据类型和亲和性分类:
存储类(Storage Classes)
SQLite 实际存储数据时使用以下五种存储类:
-
NULL
表示空值,与任何其他类型均不相同。
-
INTEGER
带符号整数,根据值大小以 1、2、3、4、6 或 8 字节存储。
-
REAL
浮点数,以 8 字节 IEEE 754 格式存储。
-
TEXT
字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
-
BLOB
二进制数据,完全按输入存储,不做任何转换。
类型亲和性(Type Affinity)
列定义中的类型名称会被映射为以下五种亲和性之一,影响数据插入时的转换规则:
-
INTEGER
匹配
INT、TINYINT、BIGINT等含 "INT" 关键字的类型声明。 -
REAL
匹配
REAL、FLOAT、DOUBLE等浮点类型声明。 -
TEXT
匹配
CHAR、VARCHAR、TEXT等字符串类型声明。 -
BLOB
仅匹配明确声明为
BLOB或无类型的情况。 -
NUMERIC
默认亲和性,匹配其他类型名(如
BOOLEAN、DATE),尝试优先转换为 INTEGER 或 REAL。
类型转换规则
插入数据时,SQLite 按以下规则处理类型亲和性:
-
INTEGER 亲和性
尝试将值转换为 INTEGER。若 TEXT 格式为整数或 REAL 无小数部分,则转换;否则存储为 REAL 或 TEXT。
-
REAL 亲和性
尝试转换为 REAL,失败时存储为 TEXT。
-
TEXT 亲和性
将值转换为 TEXT 格式。
-
BLOB 亲和性
不进行任何转换。
-
NUMERIC 亲和性
优先尝试 INTEGER,其次 REAL,最后 TEXT 或 BLOB。
示例代码
创建表时类型声明的亲和性映射示例:
sql
CREATE TABLE example (
col1 INTEGER, -- INTEGER 亲和性
col2 REAL, -- REAL 亲和性
col3 TEXT, -- TEXT 亲和性
col4 BLOB, -- BLOB 亲和性
col5 BOOLEAN -- NUMERIC 亲和性(非标准类型名)
);
插入数据时的自动转换:
sql
INSERT INTO example VALUES
(123, 45.67, 'hello', x'0102', TRUE); -- BOOLEAN 存储为 INTEGER 1
注意事项
-
动态类型灵活性
同一列可存储不同类型的数据,例如 INTEGER 列可存储 TEXT "123"。
-
日期和时间
SQLite 无内置日期类型,通常以 TEXT(ISO8601)、REAL(Julian Day)或 INTEGER(Unix Time)存储。
-
布尔值
使用
0和1表示,亲和性为 NUMERIC 或 INTEGER。