| SQLite | |
|---|---|
sqlite3コマンドラインシェルプログラムのスクリーンショット | |
| 開発者 | D.リチャード・ヒップ |
| 初回リリース | 2000年8月17日 (2000年8月17日) |
| 安定版リリース | 3.51.2 [ 1 ] |
| リポジトリ | |
| 書かれた | C |
| オペレーティング·システム | クロスプラットフォーム |
| サイズ | 699 キロバイト |
| タイプ | RDBMS(組み込み) |
| ライセンス | パブリックドメイン[ 2 ] |
| Webサイト | sqlite |
| 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 |
| この記事は構造化クエリ言語に関するシリーズの一部です。 |
SQLite(/ ˌ ɛ s ˌ k juː ˌ ɛ l ˈ aɪ t / "SQL-ite"、[ 4 ] [ 5 ] / ˈ s iː k w ə ˌ l aɪ t / "sequel-ite" [ 6 ])は、Cプログラミング言語で書かれた無料のオープンソースリレーショナルデータベースエンジンです。これはスタンドアロンアプリケーションではなく、ソフトウェア開発者がアプリケーションに埋め込むライブラリです。そのため、組み込みデータベースのファミリーに属しています。開発者によると、SQLiteは最も広く導入されているデータベースエンジンであり、いくつかの主要なWebブラウザー、オペレーティングシステム、携帯電話、その他の組み込みシステムで使用されています。[ 7 ]
多くのプログラミング言語はSQLiteライブラリへのバインディングを持っています。SQLiteは一般的にPostgreSQLの構文に従いますが、デフォルトでは型チェックを強制しません。 [ 8 ] [ 9 ]つまり、例えば整数として定義された列に文字列を挿入することが可能です。SQLiteは軽量な組み込みデータベースですが、トランザクションやACID保証を含むSQL標準とリレーショナルモデルのほとんどを実装しています。 [ 10 ]しかし、マテリアライズドビューやトリガーおよびALTER TABLE文の完全なサポートなど、他のデータベースで実装されている多くの機能は省略されています。[ 11 ]
D・リチャード・ヒップは、 2000年春、ジェネラルダイナミクス社でアメリカ海軍との契約に基づき勤務していた際にSQLiteを設計しました。[ 12 ]ヒップは、ミサイル駆逐艦のダメージコントロールシステムに使用されるソフトウェアを設計していました。このダメージコントロールシステムは、当初HP-UXとInformixデータベースをバックエンドとして利用していました。SQLiteはTcl拡張機能として始まりました。[ 13 ]
2000年8月、SQLiteのバージョン1.0がリリースされました。ストレージはgdbm(GNU Database Manager)をベースにしていました。2001年9月、SQLite 2.0はgdbmをカスタムBツリー実装に置き換え、[ a ]トランザクション機能を追加しました。2004年6月、SQLite 3.0は国際化、マニフェスト型付け、およびその他の主要な改善を加えました。これはAmerica Onlineの資金援助によるものでした。2011年、ヒップはSQLiteにNoSQLインターフェースを追加する計画を発表し、ドキュメント指向データベース向けに設計されたSQLの機能的スーパーセットであるUnQLも発表しました。[ 15 ]
SQLiteは、議会図書館が使用を承認したデータセットの長期保存に推奨される4つの形式の1つです。[ 16 ] [ 17 ] [ 18 ]
SQLiteは、データベース管理システムをインストールしたり、データベース管理者を必要とせずにプログラムを操作できるように設計されています。クライアントサーバー型データベース管理システムとは異なり、SQLiteエンジンには、アプリケーションプログラムが通信するスタンドアロンプロセスがありません。代わりに、リンカーがSQLiteライブラリを静的または動的にアプリケーションプログラムに統合します。アプリケーションプログラムは、単純な関数呼び出しを通じてSQLiteの機能を使用し、データベース操作のレイテンシを削減します。同時実行性が低い単純なクエリの場合、SQLiteのパフォーマンスはプロセス間通信のオーバーヘッドを回避することで向上します。
サーバーレス設計のため、SQLiteアプリケーションはクライアントサーバーデータベースよりも設定が少なくて済みます。SQLiteは、サービス管理、起動スクリプト、パスワードまたはGRANTベースのアクセス制御などの設定タスクが不要であるため、ゼロ設定[ 19 ]と呼ばれています。アクセス制御は、データベースファイルのファイルシステム権限によって処理されます。 [ 20 ]クライアントサーバーシステムのデータベースは、デーモンプロセスのみがデータベースファイルにアクセスできるようにするファイルシステム権限を使用します。デーモンプロセスは内部でロックを処理し、複数のプロセスからの同時書き込みを許可します。
SQLite は、定義、テーブル、インデックス、データで構成されるデータベース全体を単一のクロスプラットフォームファイルとして保存し、複数のプロセスまたはスレッドが同じデータベースに同時にアクセスできるようにします。書き込み中にデータベース ファイルをロックすることで、このシンプルな設計を実装しています。 [ 20 ]書き込みアクセスはエラー コードで失敗するか、設定可能なタイムアウトが経過するまで再試行できます。SQLite の読み取り操作はマルチタスク化できますが、サーバーレス設計のため、書き込みは順番にしか実行できません。この同時アクセス制限は一時テーブルには適用されず、バージョン 3.7 では先行書き込みログ(WAL) によって同時読み取りと書き込みが可能になったため、この制限は緩和されています。 [ 21 ] SQLite はファイル システム ロックに依存する必要があるため、書き込み集中型の展開には適していません。[ 22 ]
SQLiteはPostgreSQLをリファレンスプラットフォームとして採用しています。「PostgreSQLならどうするだろうか」という問いは、SQL標準を理解するために用いられます。[ 23 ] [ 24 ]大きな違いの一つは、主キーを除いてSQLiteは型チェックを強制しないことです。値の型は動的であり、スキーマによって厳密に制約されることはありません(ただし、スキーマは保存時に、そのような変換が潜在的に可逆である場合、変換をトリガーします)。SQLiteはポステルの規則に従うよう努めています。[ 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列のないテーブルを作成するオプションがあり、これによりディスク容量を節約し、検索速度を向上させることができます。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はJSONの内部表現をバイナリシリアル化するJSONBのサポートを追加しました。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のコードはFossilでホストされています。Fossilは、非リレーショナルデータベース形式のSQLiteをローカルキャッシュとして使用し、SQLiteのSQLを実装言語として使用する分散バージョン管理システムです。 [ 40 ] [ 41 ]
SQLiteはパブリックドメインですが、「オープンな貢献」ではありません。ウェブサイトには「このプロジェクトは、貢献をパブリックドメインに捧げる宣誓供述書を提出していない人からのパッチは受け付けません」と記載されています。 [ 42 ]創設者たちは、行動規範の代わりに、聖ベネディクトの戒律に基づく倫理規定を採用しました。[ 43 ]
SQLiteの配布物には、 sqlite3 [ 44 ]と呼ばれるスタンドアロンのコマンドラインシェルプログラムが付属しています。このプログラムを使用して、データベースの作成、テーブルの定義、行の挿入と変更、クエリの実行、SQLiteデータベースファイルの管理を行うことができます。また、SQLiteライブラリを使用するアプリケーションを作成するためのサンプルとしても役立ちます。
SQLiteは、各リリースの前に自動回帰テストを実施します。リリース検証の一環として、200万以上のテストが実行されます。SQLiteライブラリのソースコードは156,000行あり、すべてのテストスイートを合わせるとテストコードは9,200万行になります。SQLiteのテストでは、ライブラリの機能性をテストするだけでなく、電源喪失やI/Oエラーなどの様々な例外的なシナリオをシミュレートします。2009年8月10日のSQLite 3.6.17リリース以降、SQLiteリリースはコードカバレッジの構成要素の一つであるブランチテストカバレッジが100%となっています。SQLiteには、オリジナルのパブリックドメインTCLテスト、独自のC言語TH3テストスイート、SQLiteを他のSQLデータベースと比較するSQLロジックテスト、そして独自のファジングエンジンdbsqlfuzzの4つの異なるテストハーネスがあります。[ 45 ]
SQLite はデフォルトで次のものに含まれています:
製品名はどう発音しますか?鉱物のように「SQL-ite」と発音します。
[ˌɛsˌkjuˌwəlˈaɪt̚]
[ˈsikwəˌlaɪt̚]
は、読み取り側が書き込み側をブロックせず、書き込み側が読み取り側をブロックしないため、より高い同時実行性を実現します。読み取りと書き込みは同時に実行できます。
特定のROWIDを持つレコード、または指定された範囲内のROWIDを持つすべてのレコードの検索は、他のPRIMARY KEYまたはインデックス値を指定して行う同様の検索よりも約2倍高速です。
場合によっては、外部キー制約をサポートしていないデータベース ブランド (MySQL の MyISAM ストレージ エンジンやバージョン 3.6.19 より前の SQLite など) を強制的に使用しなければならないことがあります。