Hexter

Mac で SQLite データベースファイルを見る方法

Mac のどこか、アプリのサポートフォルダ、バックアップ、デバッグ中のプロジェクトで、.sqlite.db.sqlite3 ファイルを見つけて、その中に実際に何が入っているのか知りたいとします。ダブルクリックしても役に立つことは何も起きません。Quick Look は空のプレビューや文字化けしたテキストを見せます。本物の SQLite ファイルビューアが必要ですが、どのツールに手を伸ばせばいいのかは明白ではありません。

なぜ普通のファイルのように開けないのか

SQLite データベースはテキストではなくバイナリファイルです。最初の 100 バイトは固定ヘッダーで、SQLite format 3 と読めるマジック文字列に続いて、ページサイズ、テキストエンコーディング、そしてテーブル構造が変更されるたびに変わるスキーマクッキーといったフィールドが並びます。そのヘッダーの後に、実際のページデータが 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 ヘッダーを一目で認識し、フィールド、ページサイズ、エンコーディング、スキーマクッキーを、生のヘックスの隣に取り出します。これにより、ファイルが本当に SQLite かを確認したり、どのページサイズで作られたかを調べたり、きれいなデータベースを期待する何かに渡す前に、切り詰められたり上書きされたりしたヘッダーを見つけたりできます。

SQLite ファイルの最初の 100 バイトをヘッダーフィールドに分解した図:マジック文字列、ページサイズ、エンコーディング、スキーマクッキーが、Hexter が表示する生のヘックスバイトの隣に並ぶ。
あらゆる SQLite ファイルの最初の 100 バイトは固定ヘッダーです。Hexter はそれを生のバイトから直接読み取ります。

生のバイト表示が実際に重要になるとき

クエリ結果だけでなくヘッダーを直接見ることが時間を節約する、いくつかの状況:

  • ファイルがアプリで開かず、それが本当に SQLite かどうか確信がない。 一部のアプリは、SQLite ではないファイルを .db 拡張子で書き込みます。最初の 16 バイトに SQLite format 3 のマジック文字列があるか確認すれば、数秒で答えが出ます。
  • 同期やバックアップのパイプラインをデバッグしていて、ファイルが転送中に切り詰められたり壊れたりしたと疑っている。短くなったヘッダーや、ファイルの実際のサイズと合わないページサイズフィールドは、素早い診断になります。
  • データベースのテキストエンコーディング(UTF-8 か UTF-16 か)を、それを読むコードを書く前に確認したい。1 つの問いのためだけに完全なデータベースライブラリを立ち上げることなく。
  • アプリのローカルストレージをリバースエンジニアリングしていて、ちゃんとした SQL クエリを書く価値があるか判断する前に、ディスク上に実際に何があるのかを正確に見たい。

やり方

  1. .sqlite または .db ファイルを Hexter で開きます。読み取り専用で開くので、無傷で必要なデータベースをうっかり変更するリスクはありません。
  2. インスペクタサイドバーを開き、アナライズタブに切り替えます。
  3. Hexter は SQLite ヘッダーを自動的に検出し、解析されたフィールドを、それが来たバイトオフセットの隣に表示します。
  4. ページサイズやスキーマクッキーのような特定のフィールドをより詳しく見る必要があるなら、それらのバイトをヘックスグリッドで選択すると、インスペクタが数値としての解釈を直接表示します。

その後に本当に必要なのがテーブルへのクエリなら、そこで sqlite3 や DB Browser に切り替えます。それがその仕事の正しいツールです。Hexter はその前の 10 秒、つまり見ているものが何なのかを知る必要があるときのためのものです。

Hexter は、まさにこの種のファイル検査をデフォルトで安全にするために作られた、macOS ネイティブのヘックスエディタです。明示的に編集を有効にするまで読み取り専用で、SQLite、PNG、ZIP、Mach-O、WAV ファイルの組み込みの構造解析を備えています。