小巧、快速、可靠。
任選三項。

SQLite 的獨特功能

本頁重點介紹 SQLite 的一些非比尋常的特性,這些特性使 SQLite 與許多其他 SQL 資料庫引擎不同。

零設定

SQLite 在使用前不需要「安裝」。沒有「設定」程序。沒有需要啟動、停止或設定的伺服器行程。不需要管理員建立新的資料庫執行個體或指派使用者存取權限。SQLite 不使用設定檔。不需要執行任何操作來告知系統 SQLite 正在執行。系統崩潰或電源故障後無需進行任何復原操作。沒有任何需要疑難排解的地方。

SQLite 即可使用。

其他更常見的資料庫引擎在啟動後運行良好。但進行初始安裝和設定可能會非常複雜。

無伺服器

(另請參閱無伺服器文件頁面。)

大多數 SQL 資料庫引擎都是作為單獨的伺服器行程來實作的。想要存取資料庫的程式使用某種行程間通訊(通常是 TCP/IP)與伺服器通訊,以將請求傳送到伺服器並接收結果。SQLite 並非如此運作。使用 SQLite 時,想要存取資料庫的行程會直接從磁碟上的資料庫檔案讀取和寫入。沒有中間伺服器行程。

無伺服器架構有利有弊。主要優點是不需要安裝、設定、初始化、管理和疑難排解單獨的伺服器行程。這是 SQLite 成為「零設定」資料庫引擎的原因之一。使用 SQLite 的程式在執行前不需要管理支援來設定資料庫引擎。任何能夠存取磁碟的程式都能夠使用 SQLite 資料庫。

另一方面,使用伺服器的資料庫引擎可以更好地防護用戶端應用程式中的錯誤 - 用戶端中的雜散指標不會損壞伺服器上的記憶體。而且由於伺服器是單個持續性行程,因此它能夠更精確地控制資料庫存取,從而實現更細緻的鎖定和更好的並行性。

大多數 SQL 資料庫引擎都是基於用戶端/伺服器架構的。在無伺服器架構的資料庫引擎中,據作者所知,SQLite 是唯一允許多個應用程式同時存取同一個資料庫的引擎。

單一資料庫檔案

SQLite 資料庫是一個單獨的普通磁碟檔案,可以位於目錄階層結構中的任何位置。如果 SQLite 可以讀取磁碟檔案,那麼它就可以讀取資料庫中的任何內容。如果磁碟檔案及其目錄是可寫入的,那麼 SQLite 可以更改資料庫中的任何內容。資料庫檔案可以輕鬆複製到 USB 隨身碟或透過電子郵件共用。

其他 SQL 資料庫引擎傾向於將資料儲存為大量的檔案集合。通常這些檔案位於只有資料庫引擎本身才能存取的標準位置。這使得資料更安全,但也使得存取更加困難。一些 SQL 資料庫引擎提供直接寫入磁碟並繞過檔案系統的選項。這提高了效能,但代價是相當大的設定和維護複雜性。

穩定的跨平台資料庫檔案

SQLite 的檔案格式具備跨平台特性。在一台機器上寫入的資料庫檔案可以複製到不同架構的另一台機器上使用。大端序或小端序、32 位元或 64 位元都無關緊要。所有機器都使用相同的檔案格式。此外,開發人員承諾保持檔案格式的穩定性和向下相容性,因此較新版本的 SQLite 可以讀寫較舊的資料庫檔案。

大多數其他 SQL 資料庫引擎在從一個平台遷移到另一個平台時,以及通常在升級到較新版本的軟體時,都需要您傾印和還原資料庫。

精簡

經過大小最佳化後,啟用所有功能的完整 SQLite 函式庫大小不到 1MB(在 ix86 上使用 GNU 編譯器套件中的「size」工具測量)。可以在編譯時停用不需要的功能,以進一步縮減函式庫的大小。

大多數其他 SQL 資料庫引擎都比這大得多。IBM 宣稱其最近發布的 CloudScape 資料庫引擎「僅」是一個 2MB 的 jar 檔案——即使壓縮後也比 SQLite 大一個數量級!Firebird 宣稱其用戶端函式庫只有 350KB。這與 SQLite 的大小相同,甚至不包含資料庫引擎。Oracle 的 Berkeley DB 函式庫為 450KB,它省略了 SQL 支援,僅為程式設計師提供簡單的鍵/值對。

顯式類型

大多數 SQL 資料庫引擎使用靜態類型。資料類型與表格中的每一欄關聯,並且只允許將特定資料類型的值儲存在該欄中。SQLite 放寬了此限制,它使用顯式類型。在顯式類型中,資料類型是值本身的屬性,而不是儲存值的欄的屬性。因此,SQLite 允許使用者將任何資料類型的任何值儲存到任何欄中,而不管該欄的宣告類型為何。(此規則有一些例外:INTEGER PRIMARY KEY 欄只能儲存整數。並且 SQLite 會嘗試在可能的情況下將值強制轉換為欄的宣告資料類型。)

據我們所知,SQL 語言規範允許使用顯式類型。儘管如此,大多數其他 SQL 資料庫引擎都是靜態類型的,因此有些人認為使用顯式類型是 SQLite 中的一個錯誤。但 SQLite 的作者堅信這是一個功能。在 SQLite 中使用顯式類型是一個深思熟慮的設計決策,實踐證明,它使 SQLite 更可靠且更易於使用,尤其是在與動態類型程式語言(例如 Tcl 和 Python)結合使用時。

可變長度記錄

大多數其他 SQL 資料庫引擎會為大多數表格中的每一列分配固定數量的磁碟空間。它們使用特殊技巧來處理長度可能變化很大的 BLOB 和 CLOB。但對於大多數表格,如果您將一欄宣告為 VARCHAR(100),則無論您實際儲存在該欄中的資訊量有多少,資料庫引擎都會分配 100 個位元組的磁碟空間。

相反,SQLite 只使用實際需要的磁碟空間來儲存列中的資訊。如果您在 VARCHAR(100) 欄中儲存單個字元,則只會消耗一個位元組的磁碟空間。(實際上是兩個位元組——在每一欄的開頭有一些額外開銷,用於記錄其資料類型和長度。)

SQLite 使用可變長度記錄有許多優點。顯然,它會產生更小的資料庫檔案。它還可以使資料庫運行得更快,因為需要在磁碟之間移動的資訊更少。而且,使用可變長度記錄使 SQLite 可以採用顯式類型而不是靜態類型。

可讀的原始程式碼

SQLite 的原始程式碼設計為可讀性高,一般程式設計師都能夠理解。所有程序、資料結構和許多自動變數都經過精心註釋,其中包含有關其功能的實用資訊。省略了樣板註釋。

SQL 陳述式會編譯成虛擬機器程式碼

每個 SQL 資料庫引擎都會將每個 SQL 陳述式編譯成某種內部資料結構,然後用於執行陳述式的工作。但在大多數 SQL 引擎中,該內部資料結構是一個由相互連結的結構和物件組成的複雜網路。在 SQLite 中,陳述式的編譯形式是一個類似機器語言表示法的簡短程式。資料庫使用者可以透過在查詢前面加上 虛擬機器語言EXPLAIN 關鍵字來檢視這個程式。

在 SQLite 中使用虛擬機器對函式庫的開發帶來很大的好處。虛擬機器在 SQLite 的前端(解析 SQL 陳述式並產生虛擬機器碼的部分)和後端(執行虛擬機器碼並計算結果的部分)之間提供了一個清晰、明確的連接點。虛擬機器允許開發人員以易於閱讀的形式清楚地看到 SQLite 嘗試對其編譯的每個陳述式執行哪些操作,這對除錯有極大的幫助。根據編譯方式,SQLite 還能夠追蹤虛擬機器的執行 - 輸出每個虛擬機器指令及其執行時的結果。

公共領域

SQLite 的原始碼屬於公共領域。核心原始碼的任何部分均未主張版權。(說明文件和測試程式碼則不同 - 某些說明文件和測試邏輯受開放原始碼授權的規範。)所有 SQLite 核心軟體的貢獻者都已簽署了明確放棄程式碼版權的聲明。這意味著任何人都可以合法地對 SQLite 原始碼進行任何操作。

還有其他 SQL 資料庫引擎具有自由的授權,允許廣泛且自由地使用程式碼。但這些其他引擎仍然受版權法的約束。SQLite 的不同之處在於,版權法根本不適用於它。

其他 SQL 資料庫引擎的原始碼檔案通常以描述您檢視和複製該檔案的合法權利的註釋開頭。SQLite 原始碼不包含授權,因為它不受版權的約束。SQLite 原始碼沒有授權,而是提供祝福:

願你行善勿作惡
願你寬恕自己並寬恕他人
願你樂於分享,永不貪得無厭

SQL 語言擴充功能

SQLite 提供了許多其他資料庫引擎通常沒有的 SQL 語言增強功能。上述已提及 EXPLAIN 關鍵字和顯式類型。SQLite 還提供了一些陳述式,例如 REPLACEON CONFLICT 子句,可以增強對約束衝突解決的控制。SQLite 支援 ATTACHDETACH 命令,允許在同一個查詢中一起使用多個獨立的資料庫。SQLite 還定義了 API,允許使用者新增新的 SQL 函式排序序列

此頁面最後修改時間:2024-05-08 11:54:12 UTC