2026-09-17
· Dylan Yu如何打开 .db 文件:Windows、macOS 和 Linux 上的 SQLite 查看器
.db 文件几乎总是 SQLite 数据库,而如何打开它取决于你到底想用它做什么。这里讲如何确认你手上的文件是什么、我伸手去拿的四个工具,以及如何修复 .db 文件就是打不开的那些常见情况。
你双击一个 .db 文件,你的电脑要么什么都不做,要么打开了错误的应用,要么给你看一屏无法阅读的文本。如果这就是你来这里的原因,简短的回答是:.db 文件几乎总是 SQLite 数据库,有四种实用的打开方式——sqlite3 命令行、DB Browser for SQLite、DBeaver,或者像 BaseVolt 这样的本地优先管理面板。你想要哪一个,取决于你是一次性地戳戳数据,还是真的要处理它。
但"几乎总是"在这个句子里承担了实在的分量,所以在我递给你工具之前,让我们花三十秒确认你手上到底是什么。.db 扩展名不是标准——它是一种惯例,而且很多其他软件也在用它。用 SQLite 工具打开一个非 SQLite 文件,是人们以为某个工具坏了、而其实没坏的最常见原因。
这是检查的方法,然后我们逐一走过每种打开文件的方式。
首先,确认它确实是 SQLite
每个 SQLite 数据库文件都以同样的 16 个字节开头:ASCII 字符串 SQLite format 3 后面跟一个空字节。这叫做魔数头(magic header),SQLite 本身就是这样识别自己的文件的。如果这些字节在那里,不管文件叫什么名字,你手上都是一个 SQLite 数据库。如果不在,那就不是。
在 macOS 或 Linux 上,最快的检查方法是 file 命令:
file mydata.db
# mydata.db: SQLite 3.x database, last written using SQLite version 3045000
file 替你读取魔数头,直接告诉你答案。如果它说 SQLite 3.x database,那就完了——那是个 SQLite 文件。如果它说的是别的——data、Microsoft Access、Paradox、Zip archive、ASCII text——那你在处理一个完全不同的格式。
如果你想自己看原始字节,在 macOS 或 Linux 上:
head -c 16 mydata.db
# SQLite format 3
或者用 xxd:
xxd -l 16 mydata.db
# 00000000: 5351 4c69 7465 2066 6f72 6d61 7420 3300 SQLite format 3.
在 Windows 上,PowerShell 不用额外工具也能做同样的事:
Get-Content -Path .\mydata.db -Encoding Byte -TotalCount 16 | ForEach-Object { [char]$_ }
# S Q L i t e f o r m a t 3
如果头在那里,恭喜——下面的一切都适用于你。如果不在,再读一会儿,因为有几个常见的冒名顶替者。
如果它不是 SQLite 该怎么办
一个叫 something.db 但不是 SQLite 数据库的文件,通常是以下几种之一:
- 一个 Microsoft Access 数据库。 Access 文件通常是
.mdb或.accdb,但人们一直在把它们重命名为.db。如果file报告它是 Microsoft Access 数据库,你需要 Access 或一个能理解 Jet/ACE 格式的工具——不是 SQLite 工具。 - 一个 Paradox 数据库。 Borland 的 Paradox 用
.db作为它表文件的扩展名,这些会出现在老的桌面软件里。每个.db是一张表,你需要一个 Paradox 读取器或一个 ODBC 驱动。 - 一个专有应用数据库。 一些桌面应用,尤其是比较老的,会把它们的状态用自己专有的格式倒进一个
.db扩展名的文件里。这些除了写出它们的那个应用之外什么都打不开,有时候连那个应用都打不开。 - 一个非标准命名的 SQLite 文件。 反过来:你的文件可能是 SQLite,但叫
.sqlite、.sqlite3、.db3、.s3db,或者根本没有扩展名。SQLite 不在乎文件名。如果魔数头在,不管名字是什么它都是 SQLite。
最后一点值得强调:.db、.sqlite、.sqlite3 和 .db3 都只是惯例。 文件格式是一样的。扩展名只是为了让人类方便,以及让你的操作系统挑一个默认应用。如果你的文件是 SQLite 但叫 data.txt,一个 SQLite 工具仍然能打开它——你可能只是得显式地把工具指向这个文件,而不是双击。
打开 .db 文件的四种方式
既然我们知道它是 SQLite,这是我实际使用的四个工具,大致从"最快能伸手拿到的"到"对持续工作最有用的"排序。每个形状都不同,哪个合适取决于你是在做一次性查询,还是在这个数据库里待上一阵子。
1. sqlite3 命令行
sqlite3 shell 是参考实现,它随大多数类 Unix 系统一起提供,是回答关于一个数据库的问题而不用安装任何东西的最快方式。官方文档在 sqlite.org/cli.html,如果你不止偶尔用这个 CLI,值得浏览一下。
如果它还没安装:
- macOS: 它是预装的。打开终端输入
sqlite3就行。 - Linux: 从你的包管理器安装——Debian/Ubuntu 上是
sudo apt install sqlite3,Fedora 上是sudo dnf install sqlite。 - Windows: 从 SQLite 网站下载预编译工具,或者用
winget install SQLite.SQLite,或者 Chocolatey 的sqlite3包。
要打开一个文件,把它作为参数传进去。如果文件不存在,SQLite 会创建一个空的——所以要小心把名字打对,否则你会悄悄地得到一个全新的空数据库:
sqlite3 mydata.db
一旦进去,你就处于一个交互式 shell 里。有些命令以点开头——那些是由 shell 自己处理的元命令,不是发给数据库的 SQL。基础操作:
-- List all tables in the database
.tables
-- Show the CREATE statement for every table (the full schema)
.schema
-- Show the schema for one table
.schema users
-- Make the output readable (boxed table instead of pipe-delimited)
.mode box
-- Turn on column headers
.headers on
-- Now run an actual query
SELECT id, email, created_at FROM users ORDER BY created_at DESC LIMIT 10;
-- Get the row count of a table
SELECT COUNT(*) FROM users;
-- Exit
.quit
默认的输出模式是 list,它把所有东西塞进竖线分隔的行里,列一宽就折行折得很难看。切换到 .mode box 是 CLI 里最大的单项生活质量改善(.mode column 更紧凑但会截断长值)。
还有几个值得保留的元命令:
-- Import a CSV into an existing table
.mode csv
.import data.csv users
-- Export a query result to a file
.output results.txt
SELECT * FROM orders WHERE total > 100;
.output stdout
-- Show how the database is configured (page size, journal mode, etc.)
.dbinfo
-- Back up the database to another file while it's open
.backup backup.db
这个 CLI 在速度和脚本化上无可匹敌——你可以从 shell 脚本和 cron job 里把查询管道给它。它的弱点在其余一切。浏览数据很不愉快,编辑一个值意味着写一个 UPDATE 并把 WHERE 子句写对,而且它没有关系或视图的概念。它是精密工具:我不断伸手用它来做检查和自动化,很少用它做真正的数据工作。
2. DB Browser for SQLite
如果你想要一个图形工具,而且只关心 SQLite,DB Browser for SQLite 是显而易见的起点。它免费、开源、跨平台(Windows、macOS、Linux),而且存在得足够久,真正称得上稳定。你可以在 sqlitebrowser.org 获取它。
工作流很直接:启动它,点 "Open Database",挑你的 .db 文件,你就得到一个带四个主要区域的标签式界面——Database Structure(schema、表、索引、视图)、Browse Data(任意表的行网格)、Edit Pragmas(journal mode、外键和其他设置),以及 Execute SQL(查询编辑器)。
它做得好的地方:
- 浏览。 网格视图又快又可读,每列都有一个筛选框。单这一点就让它比 CLI 更适合看数据。
- 轻度编辑。 你可以双击一个单元格直接改一个值,然后把改动写入磁盘。用来修一个拼写错误或一个坏行很有用。
- schema 检查。 Database Structure 标签精确地展示定义了什么,对你不理解、继承来的数据库很棒。
- 跑临时查询。 Execute SQL 标签有语法高亮,并保存你的查询历史。
在你决定用它之前,这些局限值得知道:
- 它是查看器/编辑器,不是管理界面。 你不能构建自定义视图、dashboard 或看板。你看到的就是工具决定给你看的东西。
- 它只支持 SQLite。 如果你也处理 PostgreSQL 或 MySQL,你需要第二个工具。
- 直接编辑不留情面。 当你编辑一个单元格并提交时,它直接写到文件里。没有撤销、没有预览、没有"你确定吗"。在一个要紧的数据库上,这是真实的风险。
- 关系有限。 它显示 schema 里存在的外键,但它不帮你处理那些从未被正式化的关系——正如我以前写过的,大多数现实世界的 SQLite 数据库都是这样。
- 它可能持有写锁。 像任何以写方式打开数据库的工具一样,如果你在同一个文件上一直开着 DB Browser,它会阻塞你的应用。故障排查那节会讲更多。
对于一次性的"这个文件里有什么?"任务,DB Browser 很出色。对于持续的工作,它往往感觉像是一个十年前的桌面应用——因为它确实是,而且这些年来没怎么变。
3. DBeaver
DBeaver 是一个通用 SQL 客户端——它通过单一界面与 SQLite、PostgreSQL、MySQL、MariaDB、Oracle、SQL Server 以及几十个其他数据库对话。它免费(社区版)且开源,你可以在 dbeaver.io 获取它。如果你已经用了半打数据库引擎,有一个客户端应对全部是真正有价值的,这也是 DBeaver 拥有如此忠实追随者的原因。(更完整的拆解见 DBeaver 对比页面。)
打开一个 SQLite 文件是两步流程,而第二步是人们卡住的地方:
- 创建一个新连接,选 SQLite 作为驱动。
- 把它指向你的
.db文件。
因为 DBeaver 构建在 Java 生态之上,它通过一个 JDBC 驱动与 SQLite 对话。社区版通常在你第一次连接时替你下载驱动,但如果你离线或在防火墙后面,你需要自己提供驱动 JAR。这是 DBeaver 与 SQLite 搭配时最常见的摩擦点,在开始之前值得了解。
一旦连上,DBeaver 给你很多:
- 一个像样的查询编辑器,带自动补全、格式化和多个结果标签页。
- 树形结构的 schema 浏览,包含表、列、索引和约束。
- 网格里的数据编辑,能在执行改动前为你生成 SQL。
- ER 图,可视化表及其外键。
- 导出和导入,支持多种格式——CSV、JSON、SQL 等等。
代价是 DBeaver 是 IDE 形态的。它是一个大型应用,启动要花一会儿,界面表面积很大,而且它是为整天泡在数据库里的人构建的。如果你只是想看一个 .db 文件的内容,DBeaver 对这个活儿来说工具太多了。
另一件需要诚实的事:和 DB Browser 一样,DBeaver 是一个数据库客户端,不是管理面板。它给你看原始的表。它不会给你画廊视图、看板或 dashboard,也不会帮你处理不在 schema 里的关系。
4. 一个本地优先的管理面板(BaseVolt)
第四个选项是一个更新的类别,也是我在实际工作中用得最多的那个。一个本地优先的管理面板是一个完全跑在你机器上的桌面应用,指向你的数据库,给你一个打磨过的浏览和编辑界面——那种你通常得自己构建、或把数据上传到 SaaS 才能得到的 UI。
BaseVolt 是我用的那个,所以我会具体地描述它。它是一款本地优先的桌面应用,支持 macOS(Apple Silicon)和 Windows。它完全在你的机器上运行,可以离线工作,在本地加密你的凭据,从不把你的数据发往任何地方——一切都留在 localhost。它直接连接 PostgreSQL、MySQL、SQLite 和 Cloudflare D1,所以同一个工具覆盖你的整个技术栈。
具体到一个 .db 文件,工作流短得几乎有点冒犯人。你安装应用,点 "Add Data Source",把它指向文件。就这样。没有连接字符串、没有迁移、没有配置、没有 schema 变更。对于一个典型的数据库,大约三秒后你就有一个可用的 dashboard。如果你想在安装任何东西之前看看它,demo.basevolt.app 有一个在线演示。
打开之后你得到什么:
- 多种视图。 用于标准表浏览的网格视图、用于图片多或富内容的画廊视图、按任意字段(状态、优先级、负责人)给记录分组的看板视图,以及用于图表和统计的 dashboard。
- 关系。 它用 LLM 自动检测 schema 关系并可视化外键,所以你可以从父行导航到它的子行再回来。关键的是,它还让你定义 schema 里不存在的关系——大多数 SQLite 数据库有、但从未正式化的隐式链接。这很重要,因为正如我在 外键指南 里讲过的,SQLite 甚至无法在不做完整重建的情况下给一个已存在的表添加外键。
- 非破坏性的自定义。 你可以在 UI 里重命名字段、格式化值、连接表,而不改动你的 schema。读取同一个文件的应用代码完全不会察觉。
- 一个内置的 localhost MCP server,这意味着 Claude Desktop、Cursor、Windsurf 和 Codex 可以直接通过这个应用查询你的数据库。AI 与 BaseVolt 对话,BaseVolt 与你的文件对话——没有任何东西发给第三方。
诚实的取舍:它是桌面应用,所以默认不是团队的共享 web dashboard(Pro 档增加了跨设备同步),而且它比 DB Browser 或 DBeaver 更新,所以履历更浅。但对于"我有一个 .db 文件,我想真正处理它"这个具体活儿,它是我伸手去拿的工具。你可以在 功能页面 看功能列表,而 Hobby 档永久免费,含两个数据源、无需账号,所以试它不花任何代价。
对比表
这是这四个怎么相互比较。"编辑记录"讲的是改动数据有多愉快、多安全,而不只是技术上是否可行。
| 工具 | 平台 | 安装成本 | 最适合 | 编辑记录 |
|---|---|---|---|---|
sqlite3 CLI | Windows, macOS, Linux | macOS/Linux 上无需安装;Windows 上一个小下载 | 快速检查、脚本化、自动化 | 只能手动 UPDATE/DELETE;没有安全网 |
| DB Browser for SQLite | Windows, macOS, Linux | 一个小下载 | 浏览单个 SQLite 文件、轻度编辑 | 直接单元格编辑;无撤销,立即写入 |
| DBeaver | Windows, macOS, Linux | 更大的下载;需要 JDBC 驱动设置 | 已经在用多引擎 SQL 客户端的开发者 | 带生成 SQL 预览的网格编辑 |
| BaseVolt | macOS(Apple Silicon), Windows | 一个小下载 | 持续工作:视图、关系、dashboard | 带非破坏性 UI 层的行内编辑 |
这里没有单一的赢家。如果我需要回答关于一个文件的一个问题,我用 CLI。如果我第一次打开别人的数据库,DB Browser。如果我已经为 Postgres 跑着 DBeaver,我把 SQLite 加进去。而如果我要在这个数据库上工作不止几分钟——浏览、筛选、构建视图、导航关系——我用 BaseVolt。
如何不用 GUI 检查 .db 文件
有时候你不想安装任何东西。你在服务器上、通过 SSH,或者在容器里,你只需要知道文件里有什么。sqlite3 CLI 能处理这一切,几个一行命令就能覆盖你想要的大部分。
列出每一张表:
sqlite3 mydata.db ".tables"
获取完整 schema——每一条 CREATE 语句:
sqlite3 mydata.db ".schema"
获取一张表的 schema:
sqlite3 mydata.db ".schema users"
一次性获取每张表的行数:
sqlite3 mydata.db "SELECT name FROM sqlite_master WHERE type='table';" | while read t; do
echo -n "$t: "
sqlite3 mydata.db "SELECT COUNT(*) FROM \"$t\";"
done
列出表及其列数,并快速瞄一眼:
sqlite3 -header -column mydata.db "PRAGMA table_info(users);"
检查文件的页大小和编码:
sqlite3 mydata.db "PRAGMA page_size; PRAGMA encoding;"
检查完整性(如果你怀疑有损坏,很有用):
sqlite3 mydata.db "PRAGMA integrity_check;"
一个返回 ok 的 PRAGMA integrity_check; 意味着文件的内部结构是一致的。如果它返回别的,文件就损坏了——这是 GUI 帮不了你、你需要从备份恢复的少数情况之一。
不用 GUI 你不太容易做的一件事是看到表之间的关系。schema 会告诉你存在哪些外键,但它不会告诉你哪些列应该相关。为此,一个能可视化并让你定义关系的工具值得安装。
故障排查:当 .db 文件打不开时
大多数时候,打开一个 .db 文件就是能成。当它不能时,通常是这五个问题之一。
"Database is locked"
这是最常见的错误,而且几乎总是自己造成的。SQLite 一次只允许一个写入者。如果另一个进程——你的应用、一个正在跑的 dev server,或另一个 GUI 工具——当前持有该文件的写锁,你的新连接就拿不到锁,你就得到 database is locked(或 SQLITE_BUSY)。
修复办法是找到并关闭那个连接。一些要检查的东西:
- 你的应用还在跑并持有数据库打开吗?
- 你在另一个 SQLite 工具里——DB Browser、DBeaver、CLI——在另一个窗口里打开了这个文件吗?
- 之前有没有某个进程崩溃了而没有释放锁?
如果一个进程崩溃了并留下一个陈旧的锁,锁文件通常是罪魁祸首。在 WAL(write-ahead logging)模式下,SQLite 会在你的数据库旁边保留两个附属文件:mydata.db-wal(write-ahead log)和 mydata.db-shm(shared memory)。这些是正常且预期之中的——它们不是损坏,在任何进程打开数据库时你都不应该删除它们。如果你确定没有东西开着这个文件而锁依然存在,删除 -shm 和 -wal 文件(在确认没有进程使用它们之后)会让 SQLite 在下次打开时重建它们。
一个重要的细微之处:读取者之间不互相阻塞,而在 WAL 模式下读取者不阻塞写入者。 如果你在读取时得到 database is locked,通常是一个写入者持有锁——一个长事务,或者一个以 rollback-journal 模式而非 WAL 打开数据库的应用。如果你的应用在连接时设置 PRAGMA journal_mode = WAL;,你会看到远更少的这类错误。
文件是空的或 0 字节
一个 0 字节的 .db 文件不是数据库——它是一个空文件。这发生得比你想象的更频繁:一个应用在首次启动时创建文件,然后在写入任何东西之前崩溃;一个下载中途失败;或者一个复制操作悄悄什么都没产出。
一个空文件没有魔数头,所以每个工具要么报错,要么提出在其中创建一个新数据库。如果你确信数据本该在那里,文件很可能没了——检查有没有备份、一个仍持有未提交数据的 .db-wal 文件,或者一个 .db-journal 文件。如果一个 0 字节数据库旁边存在一个 -wal 文件,已提交的页可能仍然可恢复,但你得用 SQLite 打开它并让它恢复,而不是删除附属文件。
文件被加密了,打开是乱码
一些应用用 SQLCipher 加密它们的 SQLite 数据库,它是 SQLite 的一个增加了透明加密的分支。一个加密的 SQLCipher 数据库是一个有效的文件,但它前 16 个字节不是 SQLite 魔数头——它们是加密盐。所以 file 不会识别它,而标准的 SQLite 工具要么拒绝打开它,要么给你看二进制乱码。
如果你知道文件是 SQLCipher 加密的,你需要一个启用了 SQLCipher 的 CLI 构建,或者一个支持 SQLCipher 的工具,再加上加密密钥。标准 SQLite 读不了它,无论怎么重命名或哄骗都改变不了这一点。如果你不知道文件被加密了,这是更令人困惑的失败模式之一:文件是真实的、非空的,但什么都读不了它。
文件根本不是 SQLite
回到我们开始的地方。如果 file 报告的不是 SQLite 3.x database,你在处理一个不同的格式——Access、Paradox、一个专有二进制块,或者一个有人重命名过的纯文本或归档文件。没有 SQLite 工具能打开它。先识别格式(file 命令通常会告诉你),然后找一个针对那个格式的工具。
打开来自手机应用或 Electron 应用的 .db 文件
这个出现得足够频繁,值得单独一条注。如果这个 .db 文件来自 iOS 或 Android 应用,或者来自一个桌面 Electron 应用(Slack、Discord、VS Code,以及无数其他应用都是 Electron),它非常可能是一个真正的 SQLite 数据库——而且它在上面任何工具里都能正常打开。几个注意事项:
- 它可能被加密。 一些应用用 SQLCipher。见上文。
- 它可能用 WAL 模式并带附属文件。 如果你只复制了
.db文件而留下了-wal文件,你可能缺失了最新的写入。如果你想要一致的快照,把三个文件(.db、.db-wal、.db-shm)一起复制。 - schema 是应用的,不是你的。 你可以读它,但直接编辑它可能弄坏应用。把第三方应用的数据库当作只读,除非你完全知道自己在做什么。
- iOS 应用有时用不同的位置。 在 iOS 上,数据库住在应用的沙箱里,拿到它通常需要一个备份提取器或一台越狱设备。这超出了本文的范围,但这就是为什么"我找不到那个文件"是个常见的抱怨。
什么时候用什么
一个快速的决策指南,基于你实际想做什么:
- 你只需要回答关于这个文件的一个问题。 用
sqlite3CLI。不用安装,不麻烦。 - 你要打开一个不熟悉的数据库看看里面有什么。 用 DB Browser for SQLite。结构和浏览标签是理解一个继承来的文件的最快路径。
- 你已经用 DBeaver 处理其他数据库。 把 SQLite 加进去,为所有东西保留一个客户端。
- 你要反复处理这个数据库。 用本地优先的管理面板。你花在安装上的时间,会在你第一次需要筛选视图、连接表或看板时回本——而且你得到这一切都不需要修改 schema,这很重要,原因见 本地 SQLite 管理面板指南。
- 你在服务器上或通过 SSH。 CLI 是唯一现实可行的选项,上面的那些一行命令覆盖了检查和维护。
- 你需要可视化关系。 用一个能显示它们的工具——要么 DBeaver 的 ER 图(针对 schema 里存在的键),要么 BaseVolt(针对正式和隐式关系两者)。
如果你不确定,先用 CLI 确认文件是 SQLite 并看看它的表,然后在你知道自己会花时间在它上面时再转向 GUI。
总结一下
一个 .db 文件几乎总是 SQLite 数据库,而确认这一点是第一步——用 file 或前 16 个字节检查 SQLite format 3 魔数头,如果它不在,先弄清楚你手上到底是什么,再怪工具。.db、.sqlite、.sqlite3 和 .db3 这些扩展名都是同一个格式;名字什么也告诉不了你。
一旦你知道它是 SQLite,按你在做什么来挑工具:
sqlite3CLI 用于快速检查、脚本化和服务器工作。学会.tables、.schema和.mode box,你会受用一辈子。- DB Browser for SQLite 用于浏览单个文件和做轻度编辑。免费、简单、只支持 SQLite。
- DBeaver 如果你已经活在一个多引擎 SQL 客户端里,且不介意 JDBC 设置。
- 像 BaseVolt 这样的本地优先管理面板,当你想要真正处理数据时——网格、画廊、看板和 dashboard 视图、关系导航,以及一个不动你 schema 的非破坏性 UI 层。
而当有什么打不开时,几乎总是这五件事之一:另一个进程持有的锁、一个空文件、SQLCipher 加密、一个非 SQLite 格式,或者一个缺少 -wal 附属文件的被复制的数据库。知道你在看哪一个,就把一个令人沮丧的死胡同变成两分钟的修复。
如果你想在投入任何东西之前看看管理面板的做法,demo.basevolt.app 有一个在线演示,你可以从 下载页面 拿到应用——免费、无需账号,完全在你的机器上运行。
如果这篇对你有用,我写关于数据库、本地优先软件,以及构建开发者工具那些不光鲜的部分。在 X 上找我。