SQLite 内部:文件命名
Source: Dev.to
One Database, One File
在本质上,SQLite 数据库就是一个文件。
它没有一整套元数据目录,也没有后台守护进程在别处维护状态。
数据库 就是 这个文件,仅此而已。
当应用程序使用 sqlite3_open 打开数据库时,只需传入一个文件名:
- 可以是相对路径(相对于当前工作目录),或
- 以文件系统根目录开始的绝对路径。
任何底层操作系统接受的文件名都是合法的。SQLite 并不自行强加命名规则,只有两种特殊情况例外。
The Two Special Database Names
SQLite 将某些“文件名”视为信号,而不是字面路径。
1. Temporary Databases (NULL or Empty Names)
如果传给 sqlite3_open 的文件名是:
NULL指针,- 空字符串 (
""),或 - 仅包含空白字符的字符串,
SQLite 会创建一个 临时数据库。内部仍然使用文件,但尽可能把数据保存在内存中。每一次打开调用都会得到各自独立的临时数据库——不共享,也不复用。这类数据库是短暂的;一旦连接关闭,SQLite 会自动删除它们。
2. In-Memory Databases (:memory:)
如果文件名恰好是 ":memory:",SQLite 会创建一个 纯内存数据库:
- 磁盘上没有文件
- 连接之间不持久化
两次打开 ":memory:" 不会得到同一个数据库的两个句柄;你会得到两个完全独立、位于进程地址空间中的数据库。和临时数据库一样,它们在连接关闭的瞬间即消失。
How SQLite Names Temporary Files
当 SQLite 真正创建临时文件时,会随机生成文件名:
- 前缀:
etilqs_ - 后接 16 个随机的字母数字字符
- 没有文件扩展名
可以在编译时使用 SQLITE_TEMP_FILE_PREFIX 宏自定义前缀。
默认情况下,SQLite 按以下顺序搜索临时目录:
/var/tmp/usr/tmp/tmp
也可以通过设置 TMPDIR 环境变量来覆盖此行为。
临时文件在被正常关闭时会被删除。如果应用程序或系统崩溃,这些文件可能会残留——虽然无害,但会成为孤儿文件。
Main and Temp Databases: Two Names You Should Know
每个 SQLite 连接至少拥有两个内部数据库:
main– 你打开的主数据库文件temp– 与该连接关联的独立临时数据库
它们是 内部名称,而不是文件名,并且在 SQL 中具有实际意义。例如:
SELECT * FROM temp.table1;
查询的是临时数据库中的 table1,而不是主数据库。
每个 SQLite 库连接 都拥有自己的临时数据库。即使两个连接打开同一个主数据库文件,它们的临时数据库也是完全隔离的。
只有在首次创建临时对象时(例如)才会在磁盘上实际生成临时数据库文件:
CREATE TEMP TABLE table1 (...);
连接关闭后,SQLite 会自动删除该临时数据库文件。临时数据库的结构镜像主数据库的结构(相同的页面布局、相同的内部组织)。手动触碰这些临时文件(重命名、删除、编辑)极易导致损坏——SQLite 期望对其拥有独占控制权。
References
- SQLite Database System: Design and Implementation. Sibsankar Haldar
- GitHub examples: