SQLite データベース検査ツール
SQLite のファイルを SQL エンジンを介さずバイト列のまま読み取ります。100 バイトのヘッダーからページサイズ、テキストエンコーディング、ロールバックか WAL か、フリーリストのページ数、アプリケーションが書き込む user_version と application_id、最後に書き込んだ SQLite の版を取り出し、1 ページ目の sqlite_schema の b-tree をたどってテーブル・インデックス・ビュー・トリガーと、それぞれを定義した CREATE 文を一覧します。行数は推定ではなく、各テーブルの b-tree を葉まで実際にたどって数えた値です。ただし WAL モードでは新しいコミットが -wal ファイルに残るため本体だけでは少なく出ることがあり、WITHOUT ROWID テーブルはインデックス b-tree に行を持つので誤った数を出す代わりに不明と表示します。列名や型、PK と NOT NULL は CREATE 文を解析した結果なので、変わった DDL ではずれることがあり、原文も必ず表示します。SQLCipher などの暗号化ファイルはヘッダーごと暗号化されマジック文字列がないため、中途半端に読まずに拒否します。行の中身はあえて表示しません。何がどれだけ入っているかを答える道具です。
使い方
- .sqlite、.db、.sqlite3 のファイルを枠にドロップするか、クリックして選びます。ファイルはブラウザーの外に出ません。
- まずヘッダーを見ます。ページサイズ × ページ数がファイルサイズで、空きページは VACUUM で返る分です。
- ジャーナルモードを確認します。WAL なら -wal に残るコミットはこのファイルにないため、行数は下限と考えてください。
- テーブル一覧で行数、列と宣言された型、各テーブルに付いたインデックスを確認します。
- 解析された列がおかしいときはテーブル下の CREATE 文を開き、元の DDL を基準に判断します。
よくある質問
- ここに出る行数がアプリケーションの値と違います。
- ほとんどの場合は WAL が原因です。WAL モードの SQLite は変更されたページを別の -wal ファイルに追記し、チェックポイントのときだけ本体に取り込みます。そのため -wal を伴わずにコピーしたデータベースは最後のチェックポイント時点のスナップショットで、最近の挿入が欠けて見えます。コピー前に PRAGMA wal_checkpoint(TRUNCATE) を実行するか、-wal と -shm も一緒に移してください。もう一つの原因は WITHOUT ROWID テーブルで、この場合は誤った数ではなく不明と表示します。
- SQLCipher で暗号化したデータベースも開けますか。
- 開けません。おかしな値を見せる代わりに、そうと伝えます。SQLCipher はヘッダーごと暗号化するため、ファイルは "SQLite format 3" で始まらず、鍵がなければ解析する対象がありません。この判定は暗号化と破損の区別にも役立ちます。暗号化されていない切り詰めファイルはヘッダーが読めるので、読める範囲を読み、ページ数がファイル長と合わないと警告します。
- 空きページとは何ですか。VACUUM すべきですか。
- 行を消しても SQLite のファイルは縮みません。空いたページはフリーリストに載り、以後の挿入で再利用されます。つまり空きページはファイルがすでに確保していて再び使う領域です。VACUUM はそれを含めずにファイルを作り直し、領域をファイルシステムに返すので、大量削除の後や配布前には意味があります。ただしファイル全体を書き直し、開いている接続を無効にするため、稼働中のデータベースに気軽に実行する作業ではありません。
- user_version と application_id は何ですか。
- SQLite 自身は触らず、アプリケーションが自由に使うためにヘッダーに用意された 32 ビットの枠が二つです。多くの場合 user_version はスキーマ移行の番号として使い、コードが期待する版と比べて間の移行を実行します。application_id はファイル形式を識別するマジックナンバーとして使い、file(1) のような道具がどの種類の SQLite ファイルかを見分けられるようにします。誰も設定していなければどちらも 0 です。
- スキーマバージョンとスキーマ形式はどう違いますか。
- スキーマバージョン(スキーマクッキー)はスキーマが変わるたびに増える計数で、準備済みの文が再コンパイルの要否を判断するのに使います。スキーマ形式は 1 から 4 までのファイルレイアウトの世代で、そのファイルが使える機能を示します。4 なら降順インデックスや真偽値リテラルが許され、近年の SQLite はすべて 4 で書き込みます。
- ファイルはどこかにアップロードされますか。
- されません。ブラウザーの File API で読み、ページ内の JavaScript が解析します。サーバーに送りませんし、送る先のサーバー側の仕組みもありません。ページを開いたあとネットワークを切ってから検査しても動作することで確かめられます。
関連ツール
NumPy .npy / .npz インスペクター
.npy・.npz のヘッダーをブラウザで読み取ります。dtype、shape、バイト順、フィールド配置、先頭の値まで。NumPy もアップロードも不要です。
Ogg コンテナインスペクター
.ogg / .oga / .opus をページ単位で解析します。グラニュール位置、セグメントテーブル、CRC32 の照合、そしてコンテナが運ぶ論理ストリームを表示します。
gzip(.gz)インスペクター
.gz のヘッダーを項目ごとに読み、全メンバーをたどり、ブラウザ内で CRC32 と実サイズを再計算してトレーラーを検証します。
TZif(zoneinfo)ファイル解析ツール
コンパイル済み zoneinfo ファイルをブラウザで開き、ヘッダー、時刻タイプ、全遷移、うるう秒、POSIX TZ フッターまで解析します。
ELF バイナリ検査ツール
Linux の実行ファイル・.so・.o をブラウザーで開きます。アーキテクチャ、必要な共有ライブラリ、ビルド ID、PIE・NX・RELRO の有無まで。
ICS カレンダービューア・繰り返し展開
.ics の招待やカレンダー書き出しを開いて中身を確認し、繰り返しルールが生む実際の日付まで展開します。