Skip to content

SQLite 简介与数据类型 ​

定义 ​

SQLite 是一个嵌入式、无服务器的 SQL 关系数据库引擎:整个数据库通常存于单个 .db 文件,由应用程序进程内链接库直接读写,无需独立数据库服务进程。适合本地存储、移动应用、边缘计算(如 Cloudflare D1)等场景。

概念要点 ​

  • 零配置:无需安装、启动守护进程;打开文件即可用。
  • 单文件数据库:一个文件即一个库;备份即复制文件(注意并发写入时的 WAL 模式)。
  • ACID 事务:默认支持事务;BEGIN / COMMIT / ROLLBACK(详见 事务)。
  • 动态类型:列可声明类型,但不强制存储类;实际存储由写入值决定(见下方存储类)。
  • 类型亲和性(Type Affinity):列声明的类型名只影响比较与转换倾向,不是独立存储格式。
  • SQL 方言:与标准 SQL 大体兼容,但有 UPSERT、部分 ALTER 能力等差异(本系列按 SQLite 3.x 现行语法)。

五种存储类(Storage Classes) ​

SQLite 在磁盘上只存以下五类,没有独立的 BOOLEAN、DATETIME、DECIMAL 存储类:

存储类含义典型内容
NULL空值SQL NULL
INTEGER有符号整数1、-42、9223372036854775807
REAL浮点数3.14、1.0e10
TEXTUTF-8/UTF-16 文本'hello'、'中文'
BLOB二进制图片、protobuf 等原始字节

类型亲和性速查 ​

声明类型名中的关键字决定亲和性,不是「声明什么就存什么」:

亲和性匹配规则(类型名含下列词)倾向存储
INTEGERINT整数
REALREAL、FLOA、DOUB浮点
TEXTCHAR、CLOB、TEXT文本
BLOBBLOB二进制
NUMERIC其余(含 BOOLEAN、DATE、DATETIME、DECIMAL)整数或实数或文本,依值而定

常见误解:BOOLEAN、DATETIME、DECIMAL 是亲和性分类用的类型名,不会创建额外存储类;BOOLEAN 通常存成 0/1 整数,DATETIME 常存 ISO8601 文本。

声明类型 vs 实际存储 ​

sql
-- 列声明为 TEXT,但写入整数 — 合法,实际存储类为 INTEGER
CREATE TABLE t (a TEXT);
INSERT INTO t VALUES (42);
SELECT typeof(a) FROM t;  -- 返回 'integer'

typeof(X) 返回值的实际存储类名(小写):null、integer、real、text、blob。

语法 / 清单表 ​

操作 / 概念说明
打开数据库sqlite3 my.db 或应用内 API
查看表结构.schema table_name 或 PRAGMA table_info(table_name)
当前 SQLite 版本SELECT sqlite_version();
存储类检测typeof(column)
亲和性来源列定义中的类型名关键字
严格模式(可选)CREATE TABLE ... STRICT 强制声明类型与存储类一致(见 建表)

示例 ​

五种存储类与 typeof ​

sql
CREATE TABLE demo (
  c_null  TEXT,   -- 亲和性 TEXT,可存 NULL
  c_int   INTEGER,
  c_real  REAL,
  c_text  TEXT,
  c_blob  BLOB
);

INSERT INTO demo VALUES
  (NULL, 100, 3.14, '你好', X'48656C6C6F');  -- X'...' 为十六进制 BLOB 字面量

SELECT
  typeof(c_null) AS t_null,   -- 'null'
  typeof(c_int)  AS t_int,    -- 'integer'
  typeof(c_real) AS t_real,   -- 'real'
  typeof(c_text) AS t_text,   -- 'text'
  typeof(c_blob) AS t_blob;   -- 'blob'

BOOLEAN / DATETIME 的实际存储 ​

sql
CREATE TABLE flags (
  active   BOOLEAN,    -- 亲和性 NUMERIC,通常存 0/1
  created  DATETIME    -- 亲和性 NUMERIC,常存 ISO8601 文本
);

INSERT INTO flags VALUES (1, '2026-08-02T12:00:00Z');

SELECT typeof(active), typeof(created) FROM flags;
-- 可能返回 'integer' 与 'text',取决于写入值

动态类型跨列写入 ​

sql
CREATE TABLE flexible (id INTEGER PRIMARY KEY, payload TEXT);

INSERT INTO flexible (payload) VALUES (123);      -- 存 INTEGER
INSERT INTO flexible (payload) VALUES ('abc');    -- 存 TEXT
INSERT INTO flexible (payload) VALUES (3.5);      -- 存 REAL

SELECT id, payload, typeof(payload) FROM flexible;

易错点与交叉引用 ​

问题说明
把声明类型当强制类型默认模式下列可存任意存储类;需要严格时用 STRICT 表
认为有 BOOLEAN 类型只是 NUMERIC 亲和性的别名,存储仍是 INTEGER/TEXT 等
用 typeof 判断业务类型typeof 看存储类,不看列声明;业务日期格式需应用层约定
忽略 UTF-8TEXT 默认 UTF-8;连接时可 PRAGMA encoding 查看
与 MySQL/PostgreSQL 类型对照生搬迁移时需重写类型与约束语义

相关章节:建表 · 约束 · 插入 · VACUUM 与 PRAGMA

SQLite 官方参考 ​