SQLite 内部:文件命名

发布: (2026年1月13日 GMT+8 03:26)
5 min read
原文: Dev.to

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 按以下顺序搜索临时目录:

  1. /var/tmp
  2. /usr/tmp
  3. /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

Back to Blog

相关文章

阅读更多 »

SQLite 中的日志:超越基础

介绍 你好,我是Maneshwar。我目前正在在线构建FreeDevTools——一个免费、开源的中心,汇集所有开发者工具、作弊码和TL;D...

深入探讨 SQLite 存储

你好,我是Maneshwar。我正在开发 FreeDevTools 在线平台 https://hexmos.com/freedevtools —— 一个免费、开源的中心,汇集所有开发工具、作弊代码和 T...