SQLite 是什么
本教程共 50 篇 · 第 1 篇 · 更新于 2026-07-31
01. SQLite 是什么
本节目标:学完本章你能用大白话向别人解释“SQLite 到底是什么”,说清它和普通数据库(如 MySQL)最本质的三点区别,并理解为什么它常被藏在你每天都在用的软件里。
一句话定义
SQLite 是一个嵌入式(embedded)的关系型数据库引擎。它不是一个独立的、需要专门启动的服务程序,而是一段可以被直接“塞进”你的应用程序里的代码库(library)。当你的程序需要存数据时,SQLite 就在程序内部帮你把数据写进磁盘上的一个普通文件里。
很多人第一次听到“SQLite”会把它和“MySQL”归为一类。这能理解,但它们其实是两种完全不同的“物种”:MySQL 这种叫客户端/服务器(client/server)数据库,它背后有一个常驻的“数据库服务器进程”,你的程序和它之间要通过网络来往通信;而 SQLite 没有服务器,它就是一个文件,你的程序直接读写这个文件。
NoteSQLite 采用**动态类型(dynamic typing)+ 类型亲和性(Type Affinity)**的设计:你在建表时写的列类型只是“建议”,真正存进去的值本身带着自己的类型(存储类)。这也是为什么网上有时说它“弱类型”——但准确的说法是“动态类型”,不是“没有类型”。详情我们放到「数据类型与类型亲和性」章节专门讲。
嵌入式与进程内库
“嵌入式”这个词,最直观的理解就是:数据库引擎就在你的程序进程内部运行,不需要另外起一个进程。
打个比方,MySQL 像一栋独立的“中央图书馆”,所有借书还书的人都要跑到图书馆去、经过门禁登记(网络协议、账号权限)才能办业务;而 SQLite 像你随身带着的“笔记本”,你想记点什么,直接翻开本子写就行,不需要跑任何地方,也不需要门禁。
这种“进程内(in-process)”的架构带来几个直接好处:
- 没有网络开销。你的程序调用 SQLite 就是一次函数调用,数据从内存到磁盘文件,比“程序发请求→服务器收请求→服务器查数据→服务器回包→程序收包”少了一大圈往返。
- 没有部署负担。你不需要在服务器上安装、启动、监控一个数据库服务;SQLite 的代码直接编译进你的应用即可。
- 代码量极小。完整配置的 SQLite 库不到 400KiB,裁剪可选功能后甚至小于 250KiB,因此它能跑在手机、智能手表、机顶盒、路由器这类资源紧张的设备上。
serverless(无服务器)与零配置
这是 SQLite 最招牌的两个标签,必须一开始就点明:
- Serverless(无服务器):SQLite 没有一个独立运行的“数据库服务器进程”。不像 MySQL/PostgreSQL 那样需要你先
systemctl start mysql,SQLite 根本不存在“启动数据库”这件事。 - Zero-configuration(零配置):你不需要写配置文件、不需要做初始化参数调优、不需要建管理员账号。下载到
sqlite3这个命令行工具(或把库文件编进程序)就能直接用。
Warning正因为 SQLite 是 serverless 的,它不支持像 MySQL 那样的“多客户端通过网络同时连一个中央服务器”的模型。如果你脑子里想的是“搭一个数据库服务器,让十台机器远程连上来”,那 SQLite 不是干这个的(详见「为什么选 SQLite」与「SQLite vs MySQL/PostgreSQL」两章)。把 SQLite 当服务器用,是常见的认知错位。
数据库即单个文件
SQLite 的数据库就是一个普通的磁盘文件,常见后缀是 .db 或 .sqlite(其实后缀随便起,SQLite 不挑)。这个文件跨平台:在 Windows 上写的库文件,原封不动拷到 Linux、macOS、手机上都能打开。
这意味着什么?备份一个 SQLite 数据库,就是复制这个文件;把数据带给别人,就是把这个文件发过去;版本管理你的数据,把它丢进 Git 也能跟代码一起走(虽然大库不建议这么干)。这种“一切皆文件”的朴素哲学,是 SQLite 极其好用的根本原因之一。
对比一下:MySQL 的数据通常散落在一个数据目录里,由服务器进程统一管理,你不能随手把某个“数据库文件”单独拎出来拷走;而 SQLite 整个库就是那一个文件,简单粗暴但够用。
事务性与 ACID
别看 SQLite 简单,它在“可靠性”上一点不含糊。SQLite 的所有事务(Transaction)都完全符合 ACID(原子性、一致性、隔离性、持久性)。也就是说:一个事务里的多条改动,要么全部成功,要么全部不发生——哪怕执行到一半电脑断电、程序崩溃,数据库也不会“写了一半”而坏掉。
这一点对嵌入式场景特别重要:手机App突然被系统杀掉、嵌入式设备突然掉电,这些在服务器世界相对少见的意外,在终端设备上天天发生。SQLite 用一套成熟的日志/回滚机制扛住了这些意外,所以它能成为 Android、iOS、Chrome、Firefox、微信、支付宝等无数产品的底层存储。
自包含与跨平台
SQLite 是用 ANSI-C 写的,几乎不依赖任何操作系统特性或外部库。它的源码甚至可以打包成两个文件(sqlite3.c 和 sqlite3.h)直接拖进你的项目里一起编译。这种“自包含(self-contained)”特性让它能在从大型服务器到 8 位单片机的大量平台上运行。
同时 SQLite 还支持一些很贴心的特性,比如:
- 内存数据库:启动时如果不指定文件,SQLite 会在内存里建一个临时库,程序退出就没了,非常适合做测试与原型。
- 一个连接挂多个库文件:一条 SQL 就能把不同文件里的表 JOIN 起来,或者把数据在库之间搬来搬去。
它到底藏在哪里?
你可能从没“安装”过 SQLite,但它大概率已经在你的设备上了:
- 每一台 Android 手机、iPhone 的很多 App 都用它存本地数据;
- 主流浏览器(Chrome、Firefox、Safari)用它存书签、历史、缓存;
- 微信、飞书等桌面/移动端用它在本地缓存消息与配置;
- 很多桌面软件(如即时通讯、笔记、音乐播放器)的设置与数据都躺在某个
.db文件里。
所以,“SQLite 是什么”最接地气的答案是:它是那个你几乎感觉不到、却天天在背后帮你存东西的“隐形数据库”。
类比小结
把 SQLite 想象成“随身的笔记本”而不是“市中心的图书馆”:
- 笔记本(SQLite)= 一个文件,带在身上,翻开就写,不需要门禁和交通(serverless/零配置)。
- 图书馆(MySQL/PostgreSQL)= 一栋独立建筑,大家远程跑过去办事,有管理员、有门禁、能同时服务很多人。
笔记本适合自己记、随手记、随身记;图书馆适合很多人同时要借要还的大场面。理解了这组类比,你就掌握了 SQLite 的全部定位精髓,也自然能看懂后面“为什么选它”和“它和 MySQL 差在哪”。
Tip想亲眼看 SQLite 是不是已在你电脑上?打开终端敲
sqlite3 --version(Windows 为sqlite3.exe --version)。如果打印出版本号,说明已经有了;如果提示“命令不存在”,别慌,下一章「安装 SQLite 与环境验证」会手把手教你装。