| SQLite | |
|---|---|
sqlite3コマンドラインシェルプログラムのスクリーンショット | |
| 開発者 | D. リチャード・ヒップ |
| リリース | 2000年8月17日 ( 2000-08-17 ) |
| 安定放出 | 3.53.3 [ 1 ] (2026年6月26日( 2026年6月26日) ) |
| 執筆 | C |
| オペレーティング·システム | クロスプラットフォーム |
| サイズ | 699 KiB |
| タイプ | RDBMS(組み込み型) |
| ライセンス | パブリックドメイン[ 2 ] |
| Webサイト | sqlite.org |
| リポジトリ |
|
| SQLiteデータベースファイル形式 | |
|---|---|
| ファイル名拡張子 | .sqlite、.sqlite3、.db、.db3、.s3db、.sl3 |
| インターネットメディアの 種類 | application/vnd.sqlite3[ 3 ] |
| 魔法の数字 | 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00(ヌル終端ASCII「SQLiteフォーマット3」) |
| 初回リリース | 2004年6月18日 |
| オープンフォーマット? | はい(パブリックドメイン) |
| Webサイト | sqlite.org/fileformat.html |
SQLite(/ ˌɛsˌkjuːˌɛlˈaɪt / "SQL - ite ", [ 4 ] [ 5 ] / ˈsiːkwəˌlaɪt / "sequel-ite" [ 6 ] )は、 C言語で書かれた無料のオープンソース関係データベースエンジンです。これはスタンドアロンアプリケーションではなく、ソフトウェア開発者がアプリケーションに組み込むライブラリです。そのため、組み込みデータベースのファミリーに属します。開発者によると、 SQLiteは最も広く展開されているデータベースエンジンであり、いくつかの主要なWebブラウザ、オペレーティングシステム、携帯電話、その他の組み込みシステムで使用されています。[ 7 ]
多くのプログラミング言語には、SQLiteライブラリへのバインディングがあります。SQLiteは一般的にPostgreSQLの構文に従いますが、デフォルトでは型チェックを強制しません。[ 8 ] [ 9 ]これは、たとえば、整数として定義された列に文字列を挿入できることを意味します。SQLiteは軽量の組み込みデータベースですが、トランザクションやACID保証を含む、SQL標準とリレーショナルモデルのほとんどを実装しています。 [ 10 ]ただし、マテリアライズドビューやトリガーとALTER TABLEステートメントの完全なサポートなど、他のデータベースで実装されている多くの機能は省略されています。[ 11 ]
D. リチャード・ヒップは、 2000 年春に米国海軍との契約でゼネラル・ダイナミクスに勤務していた際に SQLite を設計した。[ 12 ]ヒップは誘導ミサイル駆逐艦に搭載される損傷制御システム用のソフトウェアを設計していた。損傷制御システムは当初、InformixデータベースをバックエンドとするHP-UXを使用していた。SQLite はTcl拡張機能として始まった。[ 13 ]
2000 年 8 月に、 gdbm (GNU Database Manager)をベースとしたストレージを備えた SQLite バージョン 1.0 がリリースされました。2001 年 9 月に、SQLite 2.0 は gdbm をカスタムB ツリー実装に置き換え、[ a ]トランザクション機能を追加しました。2004 年 6 月に、SQLite 3.0 は国際化、マニフェスト型付け、その他の主要な改善を追加し、一部はAmerica Onlineの資金提供を受けています。2011 年に Hipp は、SQLite にNoSQLインターフェースを追加する計画を発表し、ドキュメント指向データベース向けに設計されたSQLの機能的スーパーセットである UnQL も発表しました。[ 15 ]
SQLiteは、米国議会図書館が使用を承認したデータセットの長期保存に推奨される4つのフォーマットの1つです。[ 16 ] [ 17 ] [ 18 ]
SQLiteは、データベース管理システムをインストールしたり、データベース管理者を必要とせずにプログラムを操作できるように設計されています。クライアント/サーバー型のデータベース管理システムとは異なり、SQLiteエンジンにはアプリケーションプログラムが通信する独立したプロセスがありません。代わりに、リンカーがSQLiteライブラリを静的または動的にアプリケーションプログラムに統合し、アプリケーションプログラムは単純な関数呼び出しによってSQLiteの機能を利用することで、データベース操作の遅延を削減します。並行処理が少ない単純なクエリの場合、SQLiteはプロセス間通信のオーバーヘッドを回避することでパフォーマンスが向上します。
サーバーレス設計のため、SQLite アプリケーションはクライアント/サーバー データベースよりも構成が少なくて済みます。SQLite はゼロ構成と呼ばれています[ 19 ]。これは、サービス管理、起動スクリプト、パスワードまたはGRANTベースのアクセス制御などの構成タスクが不要であるためです。アクセス制御は、データベース ファイルのファイルシステム パーミッションによって処理されます。 [ 20 ]クライアント/サーバー システムのデータベースは、データベース ファイルへのアクセスをデーモン プロセスのみに許可するファイルシステムパーミッションを使用し、デーモンプロセスはロックを内部的に処理して、複数のプロセスからの同時書き込みを可能にします。
SQLite は、定義、テーブル、インデックス、データを含むデータベース全体を単一のクロスプラットフォームファイルとして保存し、複数のプロセスまたはスレッドが同じデータベースに同時にアクセスできるようにします。このシンプルな設計は、書き込み中にデータベース ファイルをロックすることによって実現されます。 [ 20 ]書き込みアクセスはエラー コードで失敗するか、構成可能なタイムアウトが経過するまで再試行できます。SQLite の読み取り操作はマルチタスクにできますが、サーバーレス設計のため、書き込みは順次実行する必要があります。この同時アクセス制限は一時テーブルには適用されず、バージョン 3.7 では、ライトアヘッド ロギング(WAL) により同時読み取りと書き込みが可能になるため緩和されています。[ 21 ] SQLite はファイルシステム ロックに依存する必要があるため、書き込みが集中するデプロイメントには推奨されません。[ 22 ]
SQLite はPostgreSQL をリファレンス プラットフォームとして使用しています。「PostgreSQL ならどうするだろうか」という考え方は、SQL 標準を理解するために使われます。[ 23 ] [ 24 ]大きな違いの 1 つは、主キーを除いて、SQLite は型チェックを強制しないことです。値の型は動的であり、スキーマによって厳密に制約されません(ただし、スキーマは、そのような変換が可逆的である可能性がある場合、保存時に変換をトリガーします)。SQLite はPostel のルールに従うよう努めています。[ 25 ]
SQLiteはSQLのSQL-92標準のほとんどを実装していますが、いくつかの機能が欠けています。たとえば、トリガーは部分的にしか提供されておらず、ビューへの書き込みはできません(ただし、この機能を提供するINSTEAD OFトリガーは提供しています)。ALTER TABLEステートメントのサポートも限定的です。[ 26 ]
SQLite は、SQL 互換 DBMS としては珍しい型システムを使用しています。ほとんどの SQL データベース システムのように列に型を割り当てるのではなく、個々の値に型が割り当てられます。言語用語で言えば、動的型付けです。さらに、Perlと同様の方法で弱型付けされています。整数型の列に文字列を挿入できます(ただし、列の優先型が整数型の場合、SQLite は最初に文字列を整数に変換しようとします)。これにより、特に動的型付けのスクリプト言語にバインドされている場合、列の柔軟性が向上します。ただし、この手法は他の SQL 製品には移植できません。一般的な批判としては、SQLite の型システムには、静的型付けされた列によって提供されるデータ整合性メカニズムが欠けているという点ですが、制約などでエミュレートできます。[ 12 ] 2021 年に、列のデータ型制約を強制する STRICT テーブルを通じて静的型付けのサポートが追加されました。[ 27 ]CHECK(typeof(x)='integer')
テーブルには通常、アクセスを高速化する非表示のrowidインデックス列が含まれています。[ 28 ]テーブルに INTEGER PRIMARY KEY 列が含まれている場合、SQLite は通常、それをrowidのエイリアスとして扱うことで最適化し、内容を厳密に型指定された64 ビット符号付き整数として格納し、その動作を自動インクリメント列に似たものに変更します。SQLite には、ディスク容量を節約し、検索速度を向上させるために rowid 列のないテーブルを作成するオプションがあります。WITHOUT ROWID テーブルには主キーが必要です。[ 29 ]
SQLiteは外部キー制約をサポートしていますが、[ 30 ] [ 31 ]デフォルトでは無効になっており、PRAGMAステートメントを使用して手動で有効にする必要があります。[ 32 ]
ストアドプロシージャはサポートされていません。これは、SQLite の典型的な使用例は、データベースに関する独自のプロシージャを定義できるホスト アプリケーションに組み込まれることであるため、開発者がシンプルさを優先するという明確な選択です。[ 33 ]
SQLite は、後方互換性のため、また Unicode テーブルのサイズが SQLite ライブラリよりも大きいため、デフォルトでは完全なUnicodeサポートを備えていません。 [ 34 ] Unicode の大文字小文字変換の完全なサポートは、オプションの拡張機能によって有効にできます。[ 35 ]
SQLiteはFTS5ロード可能な拡張機能を通じて全文検索をサポートしており、検索エンジンがウェブページを検索するのと同様に、ユーザーは多数のドキュメントからキーワードを効率的に検索できます。[ 36 ]
SQLite はjson1拡張機能を介してJSONを扱うサポートを提供しており、これは 2021 年以降デフォルトで有効になっています。SQLite の JSON 関数は 2023 年以降 JSON5 構文を処理できます。2024 年に、SQLite は JSONB のサポートを追加しました。これは、SQLite の内部 JSON 表現のバイナリシリアル化です。JSONB を使用すると、アプリケーションは JSON テキストを処理するたびに解析する必要がなくなり、少量のディスク容量を節約できます。[ 37 ]
2025年5月、25周年記念リリースであるSQLite 3.50.0では、新しいUnicode関数(unistr()およびunistr_quote())、ロックタイムアウトを設定するための新しいAPI(sqlite3_setlk_timeout())、改良されたコマンドラインツールとrsyncユーティリティの機能強化、最適化されたJSONBなどの追加機能が導入されました。[ 38 ]
SQLiteデータベースファイルの最大サポートサイズは281テラバイトです。[ 39 ]
SQLiteは通常、SQLiteデータベース内のすべてのテーブルとインデックスを単一の通常のディスクファイルに格納します。あるいは、接続文字列を使用して、SQLiteにSQLデータベース全体をメモリ:memory:内に保持するように指示することもできます。[ 40 ]
SQLite のコードはFossilでホストされています。Fossil は分散型バージョン管理システムで、SQLite を非リレーショナルデータベース形式のローカルキャッシュとして使用し、SQLite の SQL を実装言語として使用しています。[ 41 ] [ 42 ]
SQLiteはパブリックドメインですが、「オープンコントリビューション」ではありません。ウェブサイトには「このプロジェクトは、貢献をパブリックドメインに捧げる宣誓供述書を提出していない人からのパッチは受け付けません」と記載されています。 [ 43 ]行動規範の代わりに、創設者たちは聖ベネディクトの戒律第4章に基づく倫理規範を採用しています。[ 44 ]
SQLite の配布物には、 sqlite3 [ 45 ]と呼ばれるスタンドアロンのコマンドラインシェルプログラムが含まれています。これを使用すると、データベースの作成、テーブルの定義、行の挿入と変更、クエリの実行、SQLite データベースファイルの管理を行うことができます。また、SQLite ライブラリを使用するアプリケーションを作成する際の例としても役立ちます。
SQLite は、リリースごとに自動回帰テストを実行します。リリース検証の一環として 200 万を超えるテストが実行されます。SQLite ライブラリのソースコードは 156,000 行ですが、すべてのテスト スイートを合わせると、テスト コードの総行数は 9200 万行になります。SQLite のテストでは、ライブラリの機能テストに加えて、停電や I/O エラーなどの例外的なシナリオをシミュレートします。2009 年 8 月 10 日にリリースされた SQLite 3.6.17 以降、SQLite リリースでは、コード カバレッジの構成要素の 1 つである 100% のブランチ テストカバレッジが実現されています。SQLite には、オリジナルのパブリック ドメイン TCL テスト、独自の C 言語 TH3 テスト スイート、SQLiteを他の SQL データベースと比較する SQL ロジック テスト、および独自のファジングエンジンである dbsqlfuzz の4つの異なるテスト ハーネスがあります。
SQLiteはデフォルトで以下のものに含まれる:
製品名の発音は?鉱物のように「SQLite」と発音します。
[ˌɛsˌkjuˌwəlˈaɪt̚]
[ˈsikwəˌlaɪt̚]
、読み取り側が書き込み側をブロックせず、書き込み側が読み取り側をブロックしないため、より高い並行性を提供します。読み取りと書き込みは並行して実行できます。
特定の rowid を持つレコード、または指定された範囲内の rowid を持つすべてのレコードを検索すると、他の PRIMARY KEY またはインデックス値を指定して同様の検索を行う場合と比べて約 2 倍の速さで検索できます。
場合によっては、外部キー制約をサポートしていないデータベースブランドを使用せざるを得ないことがあります(たとえば、MySQLのMyISAMストレージエンジンや、バージョン3.6.19より前のSQLiteなど)。