[嵌入式数据库/RDBMS] SQLite 3.x: 全球部署最广泛的零配置、单文件、嵌入式 ACID 关系型数据库引擎

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 数据库

image

image

image

1 概述

产品介绍

SQLite 是一个自包含(self-contained)、零配置(zero-configuration)、事务性、嵌入式 SQL 数据库引擎。它不是传统的客户端/服务端数据库,而是一个被直接链接(或以动态库形式加载)到应用进程中的 C 语言库,整个数据库通常就是磁盘上的一个普通文件

  • 产品定位:嵌入式/进程内关系型数据库引擎(embedded SQL database engine),面向"不需要 DBA、不需要单独服务器、部署越简单越好"的场景。
  • 诞生背景与原因:SQLite 由 D. Richard Hipp2000 年 8 月设计并发布第一个版本,最初是为美国海军舰艇(Navy shipboard)项目打造的——当时团队希望摆脱对客户端/服务端数据库(如 PostgreSQL)"需要安装、配置、管理"的依赖,得到一个开箱即用、崩溃后能自愈、随程序一起发布的小型数据库。
  • 解决的核心问题
    • 消除传统 RDBMS 的安装、配置、运维、网络协议负担;
    • 用一个文件解决单机结构化数据持久化问题;
    • 在资源受限环境(嵌入式设备、手机、浏览器、桌面软件)提供完整的 SQL 与 ACID 事务。
  • 许可证:SQLite 采用公有领域(Public Domain,官方称 "The Blessing")方式发布,无任何版权限制,可任意复制、修改、商用,无须授权、无须署名
  • URLs

发展历程

时间 版本 关键节点
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 COLUMNALTER TABLE RENAME COLUMNRETURNING 子句
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/TRIGGERSELECT/INSERT/UPDATE/DELETE、子查询、JOIN(LEFT/INNER/CROSS)、GROUP BYHAVING、聚合函数。
  • 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 APIsqlite3_open / prepare / step / finalize / close 极简接口。
  • 单文件数据库:整库即一个 .db 文件,可直接拷贝、备份、通过邮件发送。
  • 在线备份 API.backup 命令。
  • 命令行 shellsqlite3)用于手工调试与 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 JOINFULL 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)负载——这类场景更适合 DuckDBClickHouse
  • 文件锁依赖操作系统:在网络文件系统(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)。
  • 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 数显著低估其真实影响力
  • 总结: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[应用程序<br/>C API: sqlite3_open / prepare / step] --> B[接口层 Interface] B --> C[分词器 Tokenizer] C --> D[语法分析器 Parser<br/>Lemon] D --> E[代码生成器 Code Generator] E --> F[VDBE 字节码<br/>Virtual Database Engine] F --> G[B-tree / B+tree<br/>表与索引] G --> H[Pager 分页器<br/>页缓存 + 事务 + Journal/WAL] H --> I[OS Interface / VFS<br/>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 执行的生命周期

  1. sqlite3_prepare_v2():SQL 文本经 Tokenizer → Parser → Code Generator 编译为 VDBE 字节码(这一步相当于 prepare)。
  2. sqlite3_step():VDBE 逐条执行字节码,按需向 B-tree 请求页。
  3. B-tree 通过 Pager 把页读入内存缓存;写操作由 Pager 记录 journal 或 WAL。
  4. Pager 通过 VFS 完成真正的 read/write/fsync 与文件锁。
  5. 事务 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 中使用:
# 验证
sqlite3 -version
# 打开/创建数据库
sqlite3 mydb.db
  • 作为库链接:下载 sqlite-amalgamation-*.zip,把 sqlite3.csqlite3.h 加入工程直接编译,或通过 vcpkg / NuGet 引入 sqlite3

Linux

# Debian/Ubuntu
sudo apt-get install sqlite3 libsqlite3-dev

# RHEL/CentOS
sudo dnf install sqlite

# 验证
sqlite3 -version

发行版通常自带一个较稳定的 3.x 版本;若需要最新特性(如 JSONB、最新 ALTER TABLE 支持),建议从官网下载 amalgamation 自行编译。

关键操作

-- 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()

客户端 - 本地GUI工具

本地打开 .sqlite3 文件工具汇总

1. DB Browser for SQLite(DB4S,首选)

  • 跨平台:Windows / macOS / Linux,纯专注SQLite,轻量,可便携版不用安装
  • 特点:拖拽打开 .sqlite3,表格浏览、执行SQL、导入导出CSV/JSON,新手友好
  • 官网:https://sqlitebrowser.org

2. SQLiteStudio

  • Qt开发,跨平台,SQLite专用客户端,功能更强:触发器、虚拟表、批量操作、数据库压缩
  • 官网:https://sqlitestudio.pl

3. DBeaver Community (亲测)

  • 通用多数据库客户端(MySQL/PG/SQLite等全都支持),适合你同时要连多种数据库
  • 打开:新建连接 → SQLite → 选择本地 .sqlite3 文件即可
  • 官网:https://dbeaver.io

image

4. 官方命令行 sqlite3(sqlite3.exe)

适合:写脚本批量处理的使用场景

  • SQLite官方原生工具,无GUI,终端操作,适合脚本、快速校验文件是否损坏
sqlite3 yourfile.sqlite3
.tables      # 查看所有表

5. SQLiteSpy(仅Windows)

  • 单文件绿色小程序,体积很小,打开速度快,仅Windows平台

6. DbGate

  • 跨平台,轻量,支持SQLite,也可Web模式本地运行,适合快速浏览

7. 商业付费工具(已有授权可用)

  1. Navicat for SQLite:老牌数据库客户端,界面成熟
  2. JetBrains DataGrip:IDE风格,SQL自动补全强,适合开发人员
  3. TablePlus:macOS/Windows,简洁原生界面,支持SQLCipher加密sqlite

客户端 - 代码程序

Nodejs / Java

  • Node.js:better-sqlite3 / sqlite3
  • Java:sqlite-jdbc

Python(标准库 sqlite3

import sqlite3

# conn = sqlite3.connect("xxx.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++

#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):

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 等元数据 已查证
Google 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)

4.2.2 Chroma 向量数据库(必读)

4.2.3 Apple(iOS / macOS)

4.2.4 Mozilla Firefox

4.2.5 Google(Chrome / Android)

4.2.6 Microsoft(Edge / Windows)

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 其他知名案例(补充)

  1. Intuit TurboTax / QuickBooks:SQLite 官方页面记载,Intuit 在 TurboTax 个人报税软件QuickBooks 记账软件中使用 SQLite(依据来自用户错误报告中的 SQLite 报错)。来源:SQLite Famous Users已查证
  2. Skype:SQLite 官方页面记载"在 Mac OS X 与 Windows 的 Skype 客户端中有多处 SQLite 出现(multiple sightings)",Most Deployed 页亦称"每一个 Skype 实例"都含 SQLite。来源:SQLite Famous UsersMost Deployed已查证
  3. Airbus 空客 A350 XWB:与一般消费软件不同,SQLite 官方页面记载"Airbus 已确认 SQLite 被用于 A350 XWB 系列客机的飞行软件",是 SQLite 在安全关键(safety-critical)航空系统中的标志性案例。来源:SQLite Famous Users已查证(空客向 SQLite 方确认)。
  4. Python 标准库 sqlite3:自 Python 2.5 起,所有 Python 发行版均内置 SQLitesqlite3 是标准库自带的合规 DB-API 2.0 接口,无需额外安装。来源:SQLite Famous UsersPython 官方文档 sqlite3 模块已查证
  5. PHP 内置扩展:SQLite 官方页面记载,"流行的 PHP 编程语言内置了 SQLite2 与 SQLite3"。来源:SQLite Famous UsersPHP 官方手册 SQLite3 扩展已查证
  6. Django Web 框架:Django 新建项目的 settings.pyDATABASES 默认 ENGINE 即为 django.db.backends.sqlite3,默认生成 db.sqlite3 文件,是 Python Web 开发中"开箱即用"的本地数据库。来源:Django 官方文档 DATABASES 设置已查证
  7. 其他可一并列出: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 或在线 API sqlite3_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 兼容。

Q: 查看 Windows 电脑上 Weixin 的 SQL Lite 数据库的方法? *

Y 推荐文献

X 参考文献

posted @ 2026-09-13 13:30  千千寰宇  阅读(54)  评论(0)    收藏  举报