0 序
缘起 Chroma、Weixin 、Windows、Android 等都在使用 SQL Lite
- 两年前开始、至近期多次使用、研究 DB-GPT 这个 Data-Agent 开源项目。
- DB-GPT 项目基于 Chroma 向量数据库做 Data-Agents
- Chroma 向量数据库自 0.4.0 开始,基于 SQL Lite 构建,将其作为元数据库。
DataAgents DB-GPT 源码剖析 - 博客园/数据知音
查看 本地嵌入式向量存储 chroma 的信息 - 查看 Chroma 的 嵌入式 SQL Lite 数据库



1 概述
产品介绍
SQLite 是一个自包含(self-contained)、零配置(zero-configuration)、事务性、嵌入式 SQL 数据库引擎 。它不是传统的客户端/服务端数据库 ,而是一个被直接链接(或以动态库形式加载)到应用进程中的 C 语言库 ,整个数据库通常就是磁盘上的一个普通文件。
- 产品定位:嵌入式/进程内关系型数据库引擎(embedded SQL database engine),面向"不需要 DBA、不需要单独服务器、部署越简单越好"的场景。
- 诞生背景与原因 :SQLite 由 D. Richard Hipp 于 2000 年 8 月 设计并发布第一个版本,最初是为美国海军舰艇(Navy shipboard)项目打造的------当时团队希望摆脱对客户端/服务端数据库(如 PostgreSQL)"需要安装、配置、管理"的依赖,得到一个开箱即用、崩溃后能自愈、随程序一起发布的小型数据库。
- 解决的核心问题 :
- 消除传统 RDBMS 的安装、配置、运维、网络协议负担;
- 用一个文件解决单机结构化数据持久化问题;
- 在资源受限环境(嵌入式设备、手机、浏览器、桌面软件)提供完整的 SQL 与 ACID 事务。
- 许可证 :SQLite 采用公有领域(Public Domain,官方称 "The Blessing") 方式发布,无任何版权限制,可任意复制、修改、商用,无须授权、无须署名。
- URLs :
- 官网:https://www.sqlite.org
- GitHub 镜像:https://github.com/sqlite/sqlite
- 注:官方源码以 Fossil SCM 为主仓库,GitHub 仅为只读镜像,自 2019 年起同步
发展历程
| 时间 | 版本 | 关键节点 |
|---|---|---|
| 2000-08-17 | 1.0.0 | 首次公开发布,确立嵌入式、零配置定位 |
| 2004-06-18 | 3.0.0 | 3.x 时代开端 :更紧凑的文件格式、manifest 类型系统 、BLOB 支持、UTF-8/UTF-16 双编码、用户自定义排序规则、64 位 ROWID、并发能力显著提升 |
| 2005-01-21 | 3.1.0 | 完善触发器、视图、外键等关系型特性 |
| 2010-07-21 | 3.7.0 | 首次引入 WAL(Write-Ahead Logging) 模式,读不阻塞写、写不阻塞读,成为后续主力并发模式 |
| 2013-08-26 | 3.8.0 | 改进查询优化器(基于 bytecode 的 VDBE 重写)、可内存映射 I/O、CTE(WITH 子句) |
| 2015-10-14 | 3.9.0 | 加入 JSON1 扩展、FTS5 全文检索、表达式索引、表值函数 ,并开始采用语义化版本号 |
| 2018-09-15 / 09-18 | 3.25.0 / 3.24.0 | 支持窗口函数(Window Functions) ;支持 UPSERT(ON CONFLICT ... DO UPDATE) |
| 2020-01-22 | 3.31.0 | 支持生成列(Generated Columns) ;JSON 增加 -> / ->> 运算符 |
| 2021-03-12 | 3.35.0 | 支持 ALTER TABLE DROP COLUMN、ALTER TABLE RENAME COLUMN、RETURNING 子句 |
| 2022-02-22 | 3.38.0 | JSON 函数从扩展变为内置默认 (不再需要 -DSQLITE_ENABLE_JSON1);新增 -> / ->> 与 MySQL/PG 兼容写法 |
| 2024-01-15 | 3.45.0 | 引入 JSONB(二进制 JSON 存储格式),解析更快、存储更紧凑 |
| 2026-04-09 / 2026-07-24 | 3.53.0 / 3.53.4 | 最新稳定线:ALTER TABLE 约束支持、自愈式表达式索引、WAL 损坏修复补丁等(当前主流 3.x 系列) |
截至 2026-09,官方最新发布为 3.53.4(2026-07-24),3.x 系列已连续演进 20 余年,累计发布 300+ 个版本。
主要功能
- 完整的 SQL 实现 :支持大部分 SQL92 标准,包括
CREATE TABLE/INDEX/VIEW/TRIGGER、SELECT/INSERT/UPDATE/DELETE、子查询、JOIN(LEFT/INNER/CROSS)、GROUP BY、HAVING、聚合函数。 - ACID 事务:通过 rollback journal 或 WAL 实现原子性、一致性、隔离性、持久性,崩溃后自动恢复。
- manifest 类型系统:列可声明亲和类型(INTEGER/TEXT/BLOB/REAL/NUMERIC),但允许存储任意类型。
- 内置模块 :
- FTS3/FTS4/FTS5:全文检索;
- R-Tree:空间索引;
- JSON / JSONB:JSON 函数与二进制存储;
- RTREE、Session、CSV、Series 等虚拟表/扩展。
- UTFE-8 / UTF-16 文本存储与自定义排序规则。
- 完整 C API :
sqlite3_open / prepare / step / finalize / close极简接口。 - 单文件数据库 :整库即一个
.db文件,可直接拷贝、备份、通过邮件发送。 - 在线备份 API 与
.backup命令。 - 命令行 shell (
sqlite3)用于手工调试与 SQL 交互。 - C99 标准、约 20 万行 C 源码 ,官方提供 amalgamation (合并为单个
sqlite3.c)便于嵌入编译。
核心优势
- 零部署、零配置 :没有服务进程,没有
my.cnf,不需要 root 权限,链接即用。 - 极小体积:编译后通常仅数百 KB,适合 MCU、移动端、浏览器等受限环境。
- 单文件、可移植:数据库是一个普通磁盘文件,跨架构拷贝需注意字节序与页大小,但整体部署极简。
- 极高可靠性:公有领域、十余年高强度测试(包含数千个自回归测试用例),官方自称"工作正常的时长超过全球其他所有 SQL 数据库之和"。
- ACID 与崩溃安全:rollback journal 与 WAL 保证事务原子性与掉电恢复。
- 无版权风险:公有领域,可任意闭源商用。
- 跨平台 :官方提供 Unix(
os_unix.c)与 Windows(os_win.c)两套 VFS,可移植到 RTOS、移动端。 - 语言绑定丰富:Python/Java/Go/Rust/Node.js/.NET 等几乎所有主流语言均自带或有成熟绑定。
- 读性能优秀:在单机、读多写少场景下,由于无网络开销、无进程间通信,性能常高于客户端/服务端数据库。
主要短板
- 写并发受限 :即使在 WAL 模式下,同一时刻仍然只能有一个写事务 ,不适合高并发写、多进程竞争写的业务。
- 不支持网络访问 :本身是嵌入式库,没有内置 C/S 协议 ,无法直接被远程多客户端并发连接;需要自己套一层服务。
- 无用户权限体系 :没有
GRANT/REVOKE、没有登录账号模型,访问控制 依赖操作系统文件权限。 - 无内置加密 :核心版不加密数据库文件 ;官方另有商业的 SEE(SQLite Encryption Extension)。
- SQL 方言不完全标准 :不支持
RIGHT OUTER JOIN、FULL OUTER JOIN、存储过程、存储函数体系较弱、ALTER TABLE历史上受限(3.35 后才支持 DROP COLUMN)。 - 优化器能力弱于 PostgreSQL/MySQL:复杂多表 join、大聚合、分析型查询不是其强项。
局限性
- 最大数据库尺寸 :理论上限约 281 TB(受页大小与页数限制),实际单库 GB~数十 GB 量级体验最佳。
- 最大列数、最大 SQL 长度、单条记录大小(默认 1 GB 限制,可配置)有硬上限。
- 锁粒度为数据库级 :WAL 虽允许多读单写,但写事务仍然独占;多进程高写入会频繁
SQLITE_BUSY。 - 不适合 :
- 多客户端高并发写的 Web 后端主库;
- 跨机分布式、复制、分片场景(需借助 Litestre/Bazaar 等第三方方案);
- 强分析(OLAP)负载------这类场景更适合 DuckDB 、ClickHouse。
- 文件锁依赖操作系统:在网络文件系统(NFS、SMB)上使用数据库文件可能破坏锁语义,官方明确不建议把数据库文件放在网络盘上。
适用场景
- 移动端 App 本地存储 :Android 的
SQLiteDatabase、iOS 的 Core Data 底层均为 SQLite。 - 浏览器与桌面应用:Chrome/Firefox/Safari 的站点数据、VS Code、TG 桌面端均使用 SQLite。
- 嵌入式/IoT 设备:路由器、相机、汽车中控、工业设备的本地配置与日志。
- 单机工具软件:IDE、本地笔记软件、CLI 工具、游戏存档。
- 边缘计算与客户端缓存:作为上层远程数据库的本地缓存/离线队列。
- 教学与原型开发:无需启动数据库服务,几行代码即可上手 SQL。
- 单位置、读多写少的小到中型业务:小型网站、内部工具、单机 CMS。
同类竞品
| 项目 | 类型 | 数据模型 | 网络/服务端 | 与 SQLite 的关键差异 |
|---|---|---|---|---|
| Berkeley DB (Oracle) | 嵌入式库 | 键值(无 SQL/BDB SQL 可选) | 无 | 更底层、API 面向 KV,无完整 SQL;许可证有商业版与开源版区别 |
| LevelDB | 嵌入式库 | LSM 键值 | 无 | 无 SQL、无事务多版本语义、无网络;Google 开源,适合作为缓存/队列 |
| RocksDB | 嵌入式库 | LSM 键值 | 无 | LevelDB 演进,面向写放大 与高吞吐 KV ,不提供 SQL。典型应用:Flink 状态持久化 |
| H2 | Java 嵌入式/服务端 | 关系型(纯 Java) | 可嵌入式可 C/S | 纯 Java、JVM 内存占用大、与 JVM 强绑定 |
| Apache Derby | Java 嵌入式/服务端 | 关系型(纯 Java) | 可嵌入式可 C/S | 老牌 JVM 嵌入库,性能与活跃度均落后于 SQLite |
| Firebird Embedded | 嵌入式/服务端 | 关系型 | 可嵌入式可 C/S | 跨平台、支持存储过程,部署体积大于 SQLite |
| DuckDB | 嵌入式分析型 | 列式关系型 | 无 | 面向 OLAP,SQLite 面向 OLTP;常互补使用 |
| MySQL / PostgreSQL | C/S 关系型 | 关系型 | 必须服务端 | 适合多客户端并发写,但需部署运维,单机嵌入场景过重 |
小结:SQLite 在"嵌入式 + 完整 SQL + ACID + 公有领域"这个组合上几乎没有真正的对手;其他竞品要么放弃 SQL(LevelDB/RocksDB/Berkeley DB),要么绑定特定语言(H2/Derby),要么变成服务端数据库(MySQL/PG)。
发展趋势
-
开源社区活跃趋势:
- 官方主仓库使用 Fossil SCM 托管,GitHub 仓库
sqlite/sqlite自 2019-03 起作为官方只读镜像。 - 发布节奏稳定:平均每 1~2 个月一个新点版本,2026 年仍在持续维护(最近一次推送 2026-09-12,最新发布 3.53.4 / 2026-07-24)。
- 官方主仓库使用 Fossil SCM 托管,GitHub 仓库
-
GitHub Star / Fork 真实数据
- 统计时间:2026-09-13;数据来源:GitHub REST API
https://api.github.com/repos/sqlite/sqlite: - Stars:10,460
- Forks:1,649
- Watchers / Subscribers:149
- 主语言:C;镜像创建时间:2019-03-18
- 注:由于 GitHub 仅为镜像且 SQLite 真正的"部署量"以万亿级设备内置计算(手机、浏览器、OS),Star 数显著低估其真实影响力。
- 统计时间:2026-09-13;数据来源:GitHub REST API
-
总结 :SQLite 已进入"稳定维护 + 渐进增强"阶段------核心架构 20 余年未推倒重来,仍以年均多个小版本、聚焦 JSON/JSONB、SQL 标准对齐、WAL 鲁棒性的方式持续演进,是嵌入式数据库事实上的标准,且没有衰退迹象。
行业
2 工作原理与架构
概念术语
- B-tree / B+tree:SQLite 用 B+tree 组织表数据(主键为 rowid),用 B-tree 组织二级索引,节点即为"页(page)"。
- Page(页):数据库文件按固定大小分页(默认 4096 字节,可在 512~65536 之间配置),是 Pager 调度与缓存的最小单位。
- Pager(分页器) :负责把磁盘页读入内存缓存、把脏页写回、管理回滚日志或 WAL,是事务与崩溃恢复的核心。
- Rollback Journal(回滚日志) :写操作前把被修改页的旧值写入一个单独的 journal 文件,提交时删除;崩溃后回放即可回滚。是 SQLite 默认的事务模式(
journal_mode=DELETE)。 - WAL(Write-Ahead Logging) :所有修改先追加到一个独立的
-wal文件,再在合适时机"检查点(checkpoint)"合并回主库文件;读可走 WAL,写只追加,读不阻塞写、写不阻塞读,但仍然单写者。 - VFS(Virtual File System):最底层抽象,屏蔽 Unix/Windows/RTOS 差异,提供打开/读写/加锁/时间/随机数等接口。
- Schema :数据库的元数据(表、索引、视图、触发器定义),存放在内置的
sqlite_master表中。 - VDBE(Virtual Database Engine):虚拟数据库引擎,执行由 SQL 编译产生的字节码;SQLite 把 SQL 先编译为字节码,再由 VDBE 一步步解释执行。
- Manifest Type(动态类型亲和性):列声明类型仅是"亲和性提示",值本身带类型,允许同一列存放不同类型。
- Amalgamation :官方把全部源码合并为单个
sqlite3.c+sqlite3.h,便于嵌入编译。
架构与运行原理
SQLite 采用分层管道式架构 :上层把 SQL 文本编译成字节码,下层由 VDBE 执行字节码并通过 B-tree / Pager / VFS 落盘。官方在 sqlite.org/arch.html 与 "How SQLite Works" 演讲中明确把栈划分为:Interface → Tokenizer → Parser → Code Generator → VDBE → B-tree → Pager → OS Interface(VFS)。
flowchart TD A应用程序\
C API: sqlite3_open / prepare / step --> B接口层 Interface B --> C分词器 Tokenizer C --> D语法分析器 Parser\
Lemon D --> E代码生成器 Code Generator E --> FVDBE 字节码\
Virtual Database Engine F --> GB-tree / B+tree\
表与索引 G --> HPager 分页器\
页缓存 + 事务 + Journal/WAL H --> IOS Interface / VFS\
Unix: os_unix.c / Windows: os_win.c I --> J(数据库文件 .db) H -.写前日志.-> K(-wal 或 -journal 文件) style A fill:#eef,stroke:#88a style F fill:#efe,stroke:#8a8 style H fill:#fee,stroke:#a88 style I fill:#eee,stroke:#aaa
一次 SQL 执行的生命周期:
sqlite3_prepare_v2():SQL 文本经 Tokenizer → Parser → Code Generator 编译为 VDBE 字节码(这一步相当于prepare)。sqlite3_step():VDBE 逐条执行字节码,按需向 B-tree 请求页。- B-tree 通过 Pager 把页读入内存缓存;写操作由 Pager 记录 journal 或 WAL。
- Pager 通过 VFS 完成真正的
read/write/fsync与文件锁。 - 事务
COMMIT时,Pager 把 WAL 帧提交(或删除 journal),VFS 执行fsync保证持久性。
事务与锁机制:
- 默认 rollback journal 模式 :写事务开始前对整个数据库文件加 RESERVED/EXCLUSIVE 锁,写期间其他连接只能读(旧页拷贝在 journal 中)。
- WAL 模式 :
- 写者把新页追加 到
-wal文件,不修改主库; - 读者读时同时看到主库 + WAL 的快照,写不阻塞读;
- 写者之间仍通过 WAL 头部的锁互斥,同一时刻只有一个写事务;
- 后台或显式执行
PRAGMA wal_checkpoint时,把 WAL 内容合并回主库文件。
- 写者把新页追加 到
sequenceDiagram participant App as 应用连接 participant VDBE participant Pager participant WAL as -wal 文件 participant DB as .db 主库 App->>VDBE: BEGIN;INSERT ... VDBE->>Pager: 请求修改页 Pn Pager->>WAL: 追加新页 Pn' 帧 Note over Pager,WAL: 写者持 WAL 写锁,单写 App->>VDBE: COMMIT Pager->>WAL: 提交帧(commit record) Pager->>WAL: fsync Note over App,DB: 此时读者即可在 WAL 中看到新提交版本 Pager->>DB: wal_checkpoint 合并回主库(异步/手动)
3 使用指南
安装部署
Windows
- 官方预编译二进制 :从 https://www.sqlite.org/download.html 下载
sqlite-tools-win-x64-*.zip(含sqlite3.exe),解压后加入PATH即可在 PowerShell 中使用:
powershell
# 验证
sqlite3 -version
# 打开/创建数据库
sqlite3 mydb.db
- 作为库链接 :下载
sqlite-amalgamation-*.zip,把sqlite3.c与sqlite3.h加入工程直接编译,或通过 vcpkg / NuGet 引入sqlite3。
Linux
bash
# Debian/Ubuntu
sudo apt-get install sqlite3 libsqlite3-dev
# RHEL/CentOS
sudo dnf install sqlite
# 验证
sqlite3 -version
发行版通常自带一个较稳定的 3.x 版本;若需要最新特性(如 JSONB、最新 ALTER TABLE 支持),建议从官网下载 amalgamation 自行编译。
关键操作
sql
-- 1. 创建数据库(sqlite3 命令行下直接打开文件即创建)
.open mydb.db
-- 2. 建表
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
ts REAL DEFAULT (julianday('now'))
);
-- 3. 基本 CRUD
INSERT INTO users(name, email) VALUES ('alice', 'alice@example.com');
SELECT * FROM users WHERE name = 'alice';
UPDATE users SET email = 'alice@new.com' WHERE id = 1;
DELETE FROM users WHERE id = 1;
-- 4. 事务
BEGIN;
INSERT INTO users(name) VALUES ('bob');
INSERT INTO users(name) VALUES ('carol');
COMMIT; -- 或 ROLLBACK;
-- 5. 启用 WAL(推荐读写混合场景)
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL; -- WAL 下兼顾安全与性能
PRAGMA foreign_keys = ON;
-- 6. 备份
.backup mydb_backup.db
-- 或在线 API: sqlite3_backup_init()
常见编程语言接入
Python(标准库 sqlite3)
python
import sqlite3
conn = sqlite3.connect("mydb.db") # 自动创建
cur = conn.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS t(id INTEGER PRIMARY KEY, v TEXT)")
cur.execute("INSERT INTO t(v) VALUES (?)", ("hello",))
conn.commit()
for row in cur.execute("SELECT id, v FROM t WHERE v = ?", ("hello",)):
print(row)
conn.close()
Python 自 2.5 起内置
sqlite3模块,无需安装第三方包;连接时可传:memory:得到纯内存库。
C / C++
c
#include <sqlite3.h>
#include <stdio.h>
int main(void) {
sqlite3 *db;
sqlite3_stmt *stmt;
int rc;
rc = sqlite3_open("mydb.db", &db);
if (rc != SQLITE_OK) { /* 错误处理 */ }
const char *sql = "INSERT INTO t(v) VALUES (?)";
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
sqlite3_bind_text(stmt, 1, "world", -1, SQLITE_TRANSIENT);
sqlite3_step(stmt);
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
编译链接(示例 GCC):
bash
gcc demo.c sqlite3.c -o demo -lpthread -ldl
4 行业应用:哪些软件公司的哪些软件使用了 SQLite
-
SQLite 自称是世界上部署最广泛(most widely deployed)的数据库引擎 。根据 SQLite 官方统计页面:全球现存的 SQLite 副本"数以十亿计",它出现在每一台 Android 设备、每一台 iPhone/iOS 设备、每一台 Mac、每一套 Windows 10/11、每一个 Firefox / Chrome / Safari 浏览器、每一个 Skype 实例、每一个 Dropbox 客户端、每一套 TurboTax 与 QuickBooks ,以及 PHP、Python 运行环境、绝大多数电视机和机顶盒、绝大多数车载多媒体系统中。由于智能手机保有量已超过 40 亿部、每部手机又存放着成百上千个 SQLite 数据库文件,官方估计当前活跃使用中的 SQLite 数据库超过一万亿个(1e12)。需要说明的是,这一数字来自 SQLite 官方的推算("it seems likely"),并非精确普查数据。
-
由于 SQLite 属于公有领域(public domain)、无需授权,绝大多数开发者在产品中内嵌 SQLite 后并不会主动声张,因此下面的名单远非完整列表。
4.1 案例汇总表
| 公司 / 项目 | 软件 / 产品 | 主要使用场景 | 可信度 |
|---|---|---|---|
| 腾讯 Tencent | 微信 WeChat(含 iOS / Android / 桌面端) | 本地聊天记录、联系人、会话列表、媒体索引等的加密关系型存储(WCDB 框架,基于 SQLite + SQLCipher) | 已查证 |
| Chroma | Chroma 开源向量数据库 | 单机模式下的元数据、文档、租户/集合信息与全文索引的系统数据库(chroma.sqlite3) |
已查证 |
| Apple | iOS / macOS 原生应用(短信、日历、通讯录、照片等)及 iTunes | 原生应用主数据存储;Core Data 的默认持久化栈即 SQLite | 已查证 |
| Mozilla | Firefox 浏览器、Thunderbird 邮件客户端 | 书签与历史(places.sqlite)、图标(favicons.sqlite)、Cookie 等元数据 |
已查证 |
| Chrome 浏览器 、Android 操作系统 | Chrome 历史/Cookie 等本地档案;Android 系统原生内置 SQLite 并提供 SQLiteOpenHelper API |
已查证 | |
| Microsoft | Edge 浏览器 、Windows 10/11 | Chromium 内核沿用 Chrome 的本地 SQLite 档案;Windows 10 起将 SQLite 作为系统核心组件 | 已查证 |
| Dropbox | Dropbox 桌面客户端 | 官方 SQLite 页面记载:客户端侧主数据存储 | 已查证(SQLite 官方记载,原文措辞为 "is reported to") |
| Adobe | Photoshop Lightroom | 照片目录(Catalog,.lrcat 文件)本身就是 SQLite 数据库,同时内嵌于 Adobe AIR |
已查证 |
| Intuit | TurboTax、QuickBooks | 个人税务/记账软件的本地数据存储 | 已查证 |
| Skype | Skype 桌面客户端 | 本地聊天记录与缓存(多个独立"目击"来源) | 已查证 |
| Airbus 空客 | A350 XWB 客机航电飞行软件 | 已由空客官方确认用于飞行软件 | 已查证 |
| Python 社区 | Python 标准库 sqlite3 |
Python 2.5 起所有发行版内置,作为官方内置的关系型数据库接口 | 已查证 |
| PHP 社区 | PHP 语言 | PHP 官方内置 SQLite2 / SQLite3 扩展 | 已查证 |
| Django 社区 | Django Web 框架 | 新建项目默认数据库后端即为 SQLite(db.sqlite3) |
已查证 |
4.2 案例详述
4.2.1 腾讯微信(WeChat)
- 使用场景 :微信在本地以 SQLite 数据库保存聊天记录、联系人、会话列表、媒体与文件索引 等结构化数据。出于隐私要求,微信并非直接使用裸 SQLite,而是由微信团队自研并开源了 WCDB(WeChat Core DataBase)移动数据库框架 ------该框架基于 SQLite 与 SQLCipher(SQLite 的加密扩展) 开发,对数据库文件做透明加密。
- 实际数据库文件(多平台技术文章可复现验证) :
- Android:
EnMicroMsg.db(位于/data/data/com.tencent.mm/MicroMsg/[32位用户名]/); - iOS / macOS:
MM.sqlite、WCDB_Contact.sqlite、WCDB_OpLog.sqlite等; - Windows:
WeChat Files\[微信ID]\Msg\ChatMsg.db等。
- Android:
- 为什么选 SQLite:单机嵌入式、零配置、文件即数据库,天然适合移动端;再叠加 SQLCipher 加密即可在本地落盘的同时保护用户隐私。
- 信息来源 :
- 可信度 :已查证------腾讯官方 WCDB 页面为公司一手来源,另有腾讯云、腾讯新闻及多篇取证分析文章交叉佐证。
4.2.2 Chroma 向量数据库(必读)
-
推荐文献
- DB-GPT 源码剖析 - 博客园/数据知音 【推荐】
- 查看 Chroma 的 嵌入式 SQL Lite 数据库 - 本地嵌入式向量存储 chroma 的信息
- DB-GPT 源码剖析 - 博客园/数据知音 【推荐】
-
使用场景:
- 在 Chroma 单机(single-node)/本地持久化模式 下,Chroma 使用一个名为
chroma.sqlite3的 SQLite 文件作为其系统数据库(Sysdb) ,统一存储:- 租户(tenant)、数据库(database)、集合(collection)、分片(segment)等元数据;
- 全部文档与元数据(Metadata Segment);
- 以及数据库 schema 迁移记录;
- 向量索引 本身与元数据索引落盘到文件 ,由 SQLite 负责元数据与元信息的事务化管理,并维护一个用于全文检索的 SQLite 全文索引 (
embedding_fulltext_search)。
- 在 Chroma 单机(single-node)/本地持久化模式 下,Chroma 使用一个名为
-
版本背景 :Chroma 在 0.4.0 版本 正式"放弃 DuckDB 与 ClickHouse,改用 SQLite 做元数据存储",并提供了迁移 CLI。
- 2022-10-16:创建了第1个版本 0.0.1
- 2022-10-23:发布了第1个预发布版本 0.0.2
- 2023-07-18:发布le 0.4.0 版本
-
说明 :此处只描述 SQLite 在 Chroma 中的角色与使用场景,其内部表结构、WAL、迁移机制等技术实现细节由其他章节展开。
-
参考文献/信息来源:
-
可信度 :已查证------Chroma 官方文档与官方 Cookbook 多页互证。
4.2.3 Apple(iOS / macOS)
- 使用场景 :SQLite 官方页面明确指出,Apple 在 Mac 桌面/服务器与 iPhone、iPod 等 iOS 设备上运行的绝大多数原生应用 中使用 SQLite,iTunes (即使在非 Apple 硬件上)同样使用 SQLite。具体到系统应用,短信、日历、通讯录、照片等均以 SQLite 作为本地结构化存储;在开发者框架层面,Core Data 的默认持久化类型
NSSQLiteStoreType底层就是 SQLite。 - 信息来源 :
- 可信度 :已查证------SQLite 官方页面记载,Apple 官方开发文档佐证其 Core Data 栈。
4.2.4 Mozilla Firefox
- 使用场景 :SQLite 是 Firefox 浏览器与 Thunderbird 邮件客户端的主要元数据存储格式 。用户 profile 目录下可直接看到多个
.sqlite文件:places.sqlite:全部书签、浏览历史、下载记录(核心表包括moz_places、moz_historyvisits、moz_bookmarks、moz_inputhistory等);favicons.sqlite:书签与页面网站图标;- 此外还有
cookies.sqlite(Cookie)、storage.sqlite等本地存储。
- 信息来源 :
- 可信度 :已查证------Mozilla 官方支持文档与官方 wiki 结构文档为一手来源。
4.2.5 Google(Chrome / Android)
- 使用场景 :
- Chrome 浏览器 :用户 profile 目录下的
History、Cookies、Login Data、Web Data等文件均为 SQLite 数据库 。其中History库的urls表(访问过的 URL 与访问次数)与visits表(带时间戳的逐次访问记录)保存浏览历史,可直接用sqlite3打开查看(取证领域是常识级事实)。 - Android 系统 :Android 自首个版本起原生内置 SQLite ,SDK 提供
SQLiteOpenHelper、SQLiteDatabase等 API,供应用做本地结构化存储;SQLite 官方页面明确 Google "在 Android 手机操作系统和 Chrome 浏览器中使用 SQLite"。
- Chrome 浏览器 :用户 profile 目录下的
- 信息来源 :
- 可信度 :已查证 ------Android 官方文档为一手来源,Chrome 的
History为 SQLite 文件有大量取证/技术文章交叉佐证。
4.2.6 Microsoft(Edge / Windows)
- 使用场景 :
- Windows 10/11:SQLite 官方页面记载"Microsoft 将 SQLite 作为 Windows 10 的核心组件",Most Deployed 页更直接写明"每一套 Windows 10/11 安装都带有 SQLite"。
- Edge 浏览器 :Edge 基于 Chromium 内核,沿用 Chrome 的本地存储方案------profile 目录下的
History、Cookies、Login Data等同样是 SQLite 数据库(与 Chrome 同源)。
- 信息来源 :
- 可信度 :已查证------SQLite 官方页面直接记载;Edge 与 Chrome 同为 Chromium 系,其 SQLite 档案文件为可直接验证的事实。
4.2.7 Dropbox
- 使用场景 :SQLite 官方 Famous Users 页记载,"日益流行的 Dropbox 文件归档与同步服务据称(is reported to)在客户端侧以 SQLite 作为主数据存储";Most Deployed 页也把"每一个 Dropbox 客户端"列为 SQLite 的典型存在场景。
- 可信度说明 :此处如实标注来源措辞------SQLite 官方页面用的是 "is reported to use"("据称/据报道"),即 SQLite 官方本身也是据外部报道收录,Dropbox 并未单独发布官方说明确认。
- 信息来源 :
- 可信度 :已查证(SQLite 官方页面记载) ,但原文为转述口吻,未获得 Dropbox 官方直接声明。
4.2.8 Adobe Lightroom
- 使用场景 :SQLite 官方页面明确:"Adobe 把 SQLite 用作 Photoshop Lightroom 的应用文件格式 "------即 Lightroom 的照片目录文件(Catalog,扩展名为
.lrcat)本身就是一个 SQLite 数据库,保存照片缩略图索引、元数据、编辑指令、目录关系等。此外 SQLite 也是 Adobe AIR(Adobe Integrated Runtime) 的标准组成部分,并有报道称 Acrobat Reader 同样使用 SQLite。 - 信息来源 :
- 可信度 :已查证------SQLite 官方页面直接点名。
4.2.9 其他知名案例(补充)
- Intuit TurboTax / QuickBooks :SQLite 官方页面记载,Intuit 在 TurboTax 个人报税软件 与 QuickBooks 记账软件 中使用 SQLite(依据来自用户错误报告中的 SQLite 报错)。来源:SQLite Famous Users --- 已查证。
- Skype :SQLite 官方页面记载"在 Mac OS X 与 Windows 的 Skype 客户端中有多处 SQLite 出现(multiple sightings)",Most Deployed 页亦称"每一个 Skype 实例"都含 SQLite。来源:SQLite Famous Users、Most Deployed --- 已查证。
- Airbus 空客 A350 XWB :与一般消费软件不同,SQLite 官方页面记载"Airbus 已确认 SQLite 被用于 A350 XWB 系列客机的飞行软件 ",是 SQLite 在安全关键(safety-critical)航空系统中的标志性案例。来源:SQLite Famous Users --- 已查证(空客向 SQLite 方确认)。
- Python 标准库
sqlite3:自 Python 2.5 起,所有 Python 发行版均内置 SQLite ,sqlite3是标准库自带的合规 DB-API 2.0 接口,无需额外安装。来源:SQLite Famous Users、Python 官方文档 sqlite3 模块 --- 已查证。 - PHP 内置扩展 :SQLite 官方页面记载,"流行的 PHP 编程语言内置了 SQLite2 与 SQLite3 "。来源:SQLite Famous Users、PHP 官方手册 SQLite3 扩展 --- 已查证。
- Django Web 框架 :Django 新建项目的
settings.py中DATABASES默认ENGINE即为django.db.backends.sqlite3,默认生成db.sqlite3文件,是 Python Web 开发中"开箱即用"的本地数据库。来源:Django 官方文档 DATABASES 设置 --- 已查证。 - 其他可一并列出 :Facebook 在其开源的主机审计/查询工具 osquery 中使用 SQLite 作为 SQL 引擎;Bentley Systems 把 SQLite 用作 MicroStation CAD 产品的应用文件格式;美国国会图书馆(Library of Congress) 将 SQLite 列为数字内容长期保存的推荐存储格式 ;RedHat 包管理器 RPM 使用 SQLite 记录自身状态。来源均为 SQLite 官方 Famous Users 页 --- 已查证。
4.3 深度解析:Chroma 向量数据库如何基于 SQLite 实现向量存储
4.4 为什么这些公司不约而同选择 SQLite?
综合上述案例,可以归纳出被反复选择的共性原因:
- 零部署、零管理:整个数据库就是一个磁盘文件,随应用打包分发,不需要安装/维护独立的数据库服务进程,这正是手机操作系统(iOS/Android)、桌面客户端(浏览器、微信、Lightroom)和单机软件(TurboTax)的核心诉求。
- 单文件、可移植、可归档:一个文件即完整数据库,便于备份、同步(Dropbox、Lightroom Catalog)、取证解析,也正因如此被美国国会图书馆选为长期保存推荐格式。
- 跨平台、跨语言:C 编写、无外部依赖,可静态链接进 iOS、macOS、Android、Windows、Linux 乃至机载软件,被 Python、PHP、Tcl、Xojo 等语言直接内置。
- 可靠性与免费:公有领域许可,无授权费用;历经多年大规模实战(数十亿设备),并支持 WAL 模式、事务 ACID、FTS5 全文检索等能力,足以支撑消息、书签、历史、元数据这类"写多读少、单机事务"的场景。
- 可加密扩展:如微信所用的 SQLCipher,可在保持 SQLite 接口不变的前提下对落盘文件透明加密,兼顾本地存储与隐私安全。
4.X 参考资料
Z FAQ for SQL Lite
Q: SQLite 是真正的关系型数据库吗?它支持哪些 SQL 标准特性?
A: 是。SQLite 支持绝大多数 SQL92 核心特性,包括 ACID 事务、视图、触发器、外键(需 PRAGMA foreign_keys = ON)、子查询、LEFT JOIN、聚合函数、GROUP BY、窗口函数(3.25+)、CTE、UPSERT(3.24+)、RETURNING(3.35+)。它不支持 RIGHT OUTER JOIN / FULL OUTER JOIN、存储过程体系、用户自定义权限模型。
Q: SQLite 支持多线程或多进程并发访问吗?
A: 支持,但有严格限制:
- 多线程 :SQLite 编译时默认
SQLITE_THREADSAFE=1(serialized 模式),同一连接不可跨线程共享 ;不同线程 使用各自连接是安全的。 - 多进程 :可以通过文件锁 实现多进程共享一个
.db文件,但同一时刻只允许一个写事务 ;WAL 模式下读者 可与写者【并发】,写者之间仍互斥。 - 高频写竞争会出现
SQLITE_BUSY,建议设置PRAGMA busy_timeout = 5000。
Q: WAL 模式和默认的 rollback journal 模式有什么区别?什么时候该用 WAL?
A:
- rollback journal(
journal_mode=DELETE):写前把旧页写入 journal,写者加库级 RESERVED/EXCLUSIVE 锁,读者与写者互斥;崩溃后用 journal 回滚。 - WAL(
journal_mode=WAL) :所有写操作先追加到-wal文件,读者从主库+WAL 快照读,读写互不阻塞 ,性能更好、提交延迟更低。代价是多出一个-wal文件、需要共享内存(shm)做索引、断电崩溃后需要自动恢复。 - 推荐:单机读写混合、并发读多的场景默认开启 WAL;嵌入式只读、需要最大兼容性或需要把数据库文件放在不支持文件锁的环境时,用默认模式。
Q: SQLite 数据库文件能直接拷给另一台机器用吗?能放在网络盘(NFS/SMB)上吗?
A:
- 单机/同构平台拷贝 :直接复制
.db文件(WAL 模式下还需同时复制-wal与-shm,或先执行PRAGMA wal_checkpoint(TRUNCATE);把 WAL 合并回主库)。 - 跨架构:SQLite 文件格式与字节序无关,理论上可跨小端/大端拷贝,但页大小、编码需一致。
- 网络盘 :官方明确不建议在 NFS、SMB 等网络文件系统上使用 SQLite,因为这些文件系统的文件锁实现可能不可靠,导致数据库损坏。
Q: SQLite 适合做 Web 后端的主数据库吗?
A: 取决于规模。小流量、单实例、读多写少的网站(如内部工具、CMS、个人博客)完全可以用 SQLite + WAL 撑住;但当出现以下情况时应迁移到 PostgreSQL/MySQL:
- 多机部署、多副本;
- 高并发写(>几十 TPS 持续写);
- 需要行级锁、用户权限、跨库 join、复制分片;
- 长事务与分析型负载。
业界常见做法:用 SQLite 做本地缓存/边缘节点,远端用客户端/服务端数据库做主库。
Q: SQLite 数据库文件被意外断电/崩溃后会损坏吗?如何备份?
A: 在正常使用 journal/WAL 模式并正确 fsync 的前提下,SQLite 保证事务原子性,崩溃后下次打开会自动回滚未完成事务,不会出现"半截提交"。但在极少数 I/O 不保证原子性的文件系统上仍可能损坏。
备份方式:
- 命令行:
.backup backup.db或在线 APIsqlite3_backup_*; - 冷备份:先
PRAGMA wal_checkpoint(TRUNCATE);再复制.db文件; - 不要直接
cp一个正在被写的数据库文件,可能拷到不一致状态。
Q: SQLite 是免费的吗?商用需要授权吗?
A: 完全免费、无版权限制 。SQLite 采用公有领域(Public Domain)授权,官方发布的 "The Blessing" 声明允许任何人把源码用于任何目的、修改、闭源商用,无须付费、无须署名。官方另有一个商业付费的 SEE 加密扩展(SQLite Encryption Extension),但核心数据库本身永远公有领域。
Q: SQLite 支持加密吗?数据文件会被人直接打开看到内容吗?
A: 官方核心版不加密 ,.db 文件可以用任意十六进制编辑器或 sqlite3 命令直接打开。需要加密时,常见方案:
- 购买官方 SEE 商业扩展;
- 使用第三方移植如 SQLCipher(开源、基于页面级 AES 加密),API 与 SQLite 兼容。
Y 推荐文献
- SQLite 官方文档入口 - sqlite.org
- Architecture of SQLite - sqlite.org
- SQLite Version 3 Overview - sqlite.org
- SQLite WAL 设计文档 - sqlite.org
- SQLite Database File Format - sqlite.org
- How SQLite Works(演讲 PDF, 2024) - sqlite.org
- The Definitive Guide to SQLite, 2nd Edition (Grant Allen, Mike Owens) - Apress
- SQLite Database System: Design and Implementation (Srini Chandramohan) - #
- Using SQLite (Chris Newman) - O'Reilly
- SQLite 官方 FAQ - sqlite.org
X 参考文献
- SQLite 官网首页 - sqlite.org
- sqlite/sqlite GitHub 镜像仓库 - GitHub
- GitHub REST API: /repos/sqlite/sqlite(Stars/Forks 实时数据) - GitHub
- History Of SQLite Releases(版本时间线) - sqlite.org
- Release History(详细变更日志) - sqlite.org
- SQLite Version 3 Overview - sqlite.org
- SQLite Release 3.9.0 (JSON1 / FTS5) - sqlite.org
- SQLite Older News(3.9.0 语义化版本与 JSON 说明) - sqlite.org
- Architecture of SQLite - sqlite.org
- The SQLite OS Interface or "VFS" - sqlite.org
- Write-Ahead Logging(WAL) - sqlite.org
- Database File Format - sqlite.org
- How SQLite Works 演讲 PDF (2024-06) - sqlite.org
- SQLite Download Page(Windows / Linux 预编译与 amalgamation) - sqlite.org
- sqlite3 --- DB-API 2.0 interface for SQLite databases - Python 官方文档
- SQLite 官网 About / Public Domain(The Blessing) - sqlite.org