如何在 Mac 上查看 SQLite 数据库文件
你在 Mac 上的某处找到了一个 .sqlite、.db 或 .sqlite3 文件,可能在某个应用的支持文件夹里、在一份备份里,或在一个你正在调试的项目里,而你想知道它里面到底有什么。双击它没什么用。Quick Look 显示给你一个空白预览或乱码文本。你需要一款真正的 SQLite 文件查看器,可到底该用哪个工具并不显而易见。
为什么不能像普通文件那样直接打开它
SQLite 数据库是二进制文件,不是文本。前 100 个字节是一段固定的头部:一个读作 SQLite format 3 的魔数字符串,后面跟着诸如页大小、文本编码,以及一个每次表结构被改动时都会变化的模式 cookie 之类的字段。那段头部之后才是真正的页数据,以 b-tree 组织,这就是文本编辑器把它渲染成噪声的原因。
Finder 的 Quick Look 不会解析这些内容。TextEdit 把它当成纯文本解读,显示给你的大多是无法辨认的字符,夹杂着少数认得出的字符串(表名、列名,以及表里存储的任何文本数据往往能幸存下来,因为 SQLite 基本上是原样存储字符串的)。这些都无法告诉你这个文件是否真的有效、它是用什么页大小创建的,或者为什么另一个应用拒绝打开它。
查看内部的几种选择
sqlite3 命令行工具。 macOS 在 Terminal 中自带 sqlite3。运行 sqlite3 yourfile.db ".schema",你就能得到表定义,或者用 .tables 得到一个快速列表。如果你已经知道这是一个有效的数据库,并且想查询它,这就很好用。如果你一开始就不确定这个文件是否有效,它就没那么有用了,因为一个损坏的头部只会产生一个晦涩的错误,对哪里出了问题没有任何细节。
DB Browser for SQLite。 如果你的真正目标是浏览表中的行、编辑数据或运行 SQL 查询,这才是正确的工具。它免费、维护良好,并且专门为这项工作打造。如果你需要探索表里的数据,别读这篇文章了,直接去装 DB Browser。
一款懂 SQLite 的十六进制编辑器。 这是面向另一个问题的选择:不是"表里有什么",而是"这个文件到底是什么"。那正是 Hexter 填补的空缺。打开这个文件,它默认以只读方式读取,所以你不会仅仅因为看一眼就冒险损坏文件。分析标签页一眼就能识别出 SQLite 头部,并把各个字段(页大小、编码、模式 cookie)拆解出来,陈列在原始十六进制旁边,让你能确认这个文件确实是 SQLite、查看它是用什么页大小构建的,或者在你把它交给某个期望一个干净数据库的东西之前,发现一个被截断或被覆盖的头部。
什么时候原始字节视图真正重要
有几种情况下,直接看头部,而不只是看查询结果,能省下时间:
- 一个文件在你的应用里打不开,而你不确定它是否真的是 SQLite。 有些应用写出的文件带着
.db扩展名,却根本不是 SQLite。在前 16 个字节里检查SQLite format 3这个魔数字符串,几秒钟就能给出答案。 - 你正在调试一条同步或备份流水线,并怀疑某个文件在传输途中被截断或损坏了。一个被截短的头部,或一个与文件实际大小不符的页大小字段,是一次快速的诊断。
- 你想在编写读取代码之前确认一个数据库的文本编码(UTF-8 还是 UTF-16),而不必为了问一个问题就启动一整个数据库库。
- 你正在逆向一个应用的本地存储,想在决定是否值得对它写一条正规的 SQL 查询之前,先看清磁盘上到底有什么。
具体怎么做
- 在 Hexter 中打开这个
.sqlite或.db文件。它以只读方式打开,所以不会有意外修改一个你需要保持完好的数据库的风险。 - 打开检查器侧边栏,切换到分析标签页。
- Hexter 会自动检测到 SQLite 头部,并把解析出的字段陈列给你看,旁边是它们所来自的字节偏移。
- 如果你需要更仔细地看某个特定字段,比如页大小或模式 cookie,就在十六进制网格里选中那些字节,检查器会直接把数值解读显示给你。
如果你在那之后真正需要的是查询表,那就该切换到 sqlite3 或 DB Browser 了。它们才是这项工作的正确工具。Hexter 面向的是在那之前的那十秒钟,当你只是需要知道自己在看的是什么。
Hexter 是一款原生 macOS 十六进制编辑器,就是为了让这类文件检查默认安全而打造:在你显式启用编辑之前始终只读,并对 SQLite、PNG、ZIP、Mach-O 和 WAV 文件内置结构解析。