小巧、快速、可靠。
選擇其中三項。
編譯時期選項

1. 概述

在大多數情況下,使用預設編譯選項即可順利建置 SQLite。然而,如有需要,可以使用以下記錄的編譯時期選項來省略 SQLite 功能(從而減小編譯後的程式庫大小)或更改某些參數的預設值

我們已盡一切努力確保各種編譯選項組合能夠協調一致地工作並產生可用的程式庫。儘管如此,強烈建議在使用以非標準編譯選項建置的 SQLite 程式庫之前執行 SQLite 測試套件以檢查錯誤。

2. 建議的編譯時期選項

對於能夠使用它們的應用程式,建議使用以下編譯時期選項,以盡量減少 SQLite 使用的 CPU 週期數和記憶體位元組數。並非所有應用程式都能使用所有這些編譯時期選項。例如,SQLITE_THREADSAFE=0 選項僅適用於從不在多個執行緒同時存取 SQLite 的應用程式。而 SQLITE_OMIT_PROGRESS_CALLBACK 選項僅適用於不使用 sqlite3_progress_handler() 介面的應用程式,依此類推。

不可能測試 SQLite 的所有可能的編譯時期選項組合。但以下這組編譯時期選項是一個經過完整測試的配置。

  1. SQLITE_DQS=0。此設定會停用雙引號字串字面值的錯誤功能。

  2. SQLITE_THREADSAFE=0。設定 -DSQLITE_THREADSAFE=0 會導致 SQLite 中的所有互斥鎖和執行緒安全邏輯被省略。這是單個編譯時期選項,可使 SQLite 的執行速度提高約 2%,並將程式庫的大小減少約 2%。但缺點是使用此編譯時期選項意味著 SQLite 無法同時由多個執行緒使用,即使每個執行緒都有自己的資料庫連線。

  3. SQLITE_DEFAULT_MEMSTATUS=0。此設定會停用追蹤記憶體使用情況的 sqlite3_status() 介面。這有助於 sqlite3_malloc() 常式執行得更快,而且由於 SQLite 在內部使用 sqlite3_malloc(),這有助於使整個程式庫更快。

  4. SQLITE_DEFAULT_WAL_SYNCHRONOUS=1。為了在斷電後達到最高的資料庫安全性,建議設定 PRAGMA synchronous=FULL。然而,在 WAL 模式 下,使用 PRAGMA synchronous=NORMAL 即可保證完整的資料庫完整性。在 WAL 模式 中使用 PRAGMA synchronous=NORMAL 時,斷電可能會導致資料庫最近的更改被回滾,但資料庫不會損毀。此外,在 WAL 模式下使用 synchronous=NORMAL 進行交易提交比使用預設的 synchronous=FULL 快得多。基於這些原因,建議在切換到 WAL 模式時將 synchronous 設定從 FULL 更改為 NORMAL。這個編譯時期選項將會完成此設定。

  5. SQLITE_LIKE_DOESNT_MATCH_BLOBS。過去,SQLite 允許 LIKEGLOB 運算元的 BLOB 運算元。但是,將 BLOB 作為 LIKEGLOB 的運算元會使 LIKE 優化 變得複雜且速度變慢。設定此選項表示如果任一運算元是 BLOB,LIKE 和 GLOB 運算子將一律返回 FALSE。這簡化了 LIKE 優化 的實作,並允許使用 LIKE 優化 的查詢更快地運行。

  6. SQLITE_MAX_EXPR_DEPTH=0。將最大表達式剖析樹深度設定為零會停用所有表達式剖析樹深度檢查,從而簡化程式碼,加快執行速度,並有助於剖析樹使用更少的記憶體。

  7. SQLITE_OMIT_DECLTYPE。藉由省略(很少需要)從查詢結果集中返回欄位宣告類型的能力,可以使 預編譯語句 消耗更少的記憶體。

  8. SQLITE_OMIT_DEPRECATED。省略已棄用的介面和功能並不會幫助 SQLite 更快地運行。然而,它會減少程式庫的占用空間。而且這是正確的做法。

  9. SQLITE_OMIT_PROGRESS_CALLBACK。必須在 位元組碼引擎 的內部迴圈中檢查進度處理程式回呼計數器。藉由省略此介面,可以從 位元組碼引擎 的內部迴圈中移除單個條件式,從而幫助 SQL 語句略微加快運行速度。

  10. SQLITE_OMIT_SHARED_CACHE。省略使用 共用快取 的可能性可以消除程式碼中效能關鍵區段的許多條件式。這可以顯著提高效能。

  11. SQLITE_USE_ALLOCA。在支援 alloca() 的系統上,使用 alloca() 動態分配臨時堆疊空間,以供單個函數內部使用。如果沒有此選項,則會從堆積中分配臨時空間。

  12. SQLITE_OMIT_AUTOINIT。在使用某些介面之前,需要使用呼叫 sqlite3_initialize() 來初始化 SQLite 程式庫。此初始化通常在第一次需要時自動發生。然而,使用 SQLITE_OMIT_AUTOINIT 選項時,會省略自動初始化。這有助於許多 API 呼叫更快地運行(因為它們不必檢查是否已進行初始化,然後在尚未呼叫初始化的情況下運行初始化),但也意味著應用程式必須手動呼叫 sqlite3_initialize()。如果使用 -DSQLITE_OMIT_AUTOINIT 編譯 SQLite,並且在沒有先呼叫 sqlite3_initialize() 的情況下呼叫 sqlite3_malloc()sqlite3_vfs_find()sqlite3_open() 等常式,則可能會導致區段錯誤。

  13. SQLITE_STRICT_SUBTYPE=1。如果一個應用程式自訂函數沒有 SQLITE_RESULT_SUBTYPE 屬性卻呼叫了 sqlite3_result_subtype() 介面,這個選項會導致錯誤發生。除非函數註冊了 SQLITE_RESULT_SUBTYPE 屬性,否則 sqlite3_result_subtype() 介面無法可靠地運作。此編譯時期選項旨在讓開發人員及早注意到這個問題。

當使用上述所有建議的編譯時期選項時,SQLite 函式庫將會縮小約 3%,並減少約 5% 的 CPU 使用週期。因此,這些選項並不會造成巨大的差異。但在某些設計情況下,一點一滴都有幫助。

函式庫層級的配置選項,例如上面列出的選項,可以選擇在用戶端標頭檔中定義。定義 SQLITE_CUSTOM_INCLUDE=myconfig.h(不含引號)將會使 sqlite3.c 在編譯過程的早期包含 myconfig.h,讓用戶端能夠自訂旗標,而不必將所有旗標都明確地傳遞給編譯器。

3. 平台配置

_HAVE_SQLITE_CONFIG_H

如果定義了 _HAVE_SQLITE_CONFIG_H 巨集,SQLite 原始碼將會嘗試 #include 名為 "sqlite_cfg.h" 的檔案。"sqlite_cfg.h" 檔案通常包含其他配置選項,尤其是由 autoconf 腳本產生的 "HAVE_INTERFACE" 類型選項。請注意,此標頭檔僅供平台層級配置使用,而非函式庫層級配置。要在自訂標頭檔中設定 SQLite 層級的配置旗標,請定義 SQLITE_CUSTOM_INCLUDE=myconfig.h,如上一節所述。

HAVE_FDATASYNC

如果 HAVE_FDATASYNC 編譯時期選項為真,則 Unix 系統的預設 虛擬檔案系統 (VFS) 將會嘗試在適當的情況下使用 fdatasync() 取代 fsync()。如果此旗標遺漏或為假,則一律使用 fsync()。

HAVE_GMTIME_R

如果 HAVE_GMTIME_R 選項為真,且 SQLITE_OMIT_DATETIME_FUNCS 為真,則 CURRENT_TIME、CURRENT_DATE 和 CURRENT_TIMESTAMP 關鍵字將使用執行緒安全的 "gmtime_r()" 介面,而不是 "gmtime()"。在 SQLITE_OMIT_DATETIME_FUNCS 未定義或為假的一般情況下,則使用內建的 日期和時間函數 來實作 CURRENT_TIME、CURRENT_DATE 和 CURRENT_TIMESTAMP 關鍵字,且永遠不會呼叫 gmtime_r() 或 gmtime()。

HAVE_ISNAN

如果 HAVE_ISNAN 選項為真,則 SQLite 會呼叫系統函式庫 isnan() 函數來判斷雙精度浮點值是否為 NaN。如果 HAVE_ISNAN 未定義或為假,則 SQLite 會使用其自行開發的 isnan() 實作來取代。

HAVE_LOCALTIME_R

如果 HAVE_LOCALTIME_R 選項為真,則 SQLite 會使用執行緒安全的 localtime_r() 函式庫常式,而不是 localtime(),來協助實作內建 日期和時間函數localtime 修飾詞

HAVE_LOCALTIME_S

如果 HAVE_LOCALTIME_S 選項為真,則 SQLite 會使用執行緒安全的 localtime_s() 函式庫常式,而不是 localtime(),來協助實作內建 日期和時間函數localtime 修飾詞

HAVE_MALLOC_USABLE_SIZE

如果 HAVE_MALLOC_USABLE_SIZE 選項為真,則 SQLite 會嘗試使用 malloc_usable_size() 介面來尋找從標準函式庫 malloc() 或 realloc() 常式取得的記憶體配置大小。此選項僅適用於使用標準函式庫 malloc() 的情況。在 Apple 系統上,使用的是「區域 malloc」,因此此選項不適用。當然,如果應用程式使用 SQLITE_CONFIG_MALLOC 提供自己的 malloc 實作,則此選項無效。

如果省略 HAVE_MALLOC_USABLE_SIZE 選項或其值为 false,則 SQLite 會使用 system malloc() 和 realloc() 的包裝函式,將每個配置的大小增加 8 個位元組,並將配置的大小寫入起始的 8 個位元組中,然後 SQLite 也會實作自己的 malloc_usable_size() 版本,該版本會參考該 8 位元組的前綴以查找配置大小。這種方法有效,但並非最佳方法。鼓勵應用程式盡可能使用 HAVE_MALLOC_USABLE_SIZE。

HAVE_STRCHRNUL

如果 HAVE_STRCHRNUL 選項為 true,則 SQLite 會使用 strchrnul() 函式庫函式。如果此選項遺漏或為 false,則 SQLite 會以其自行開發的 strchrnul() 實作來取代。

HAVE_UTIME

如果 HAVE_UTIME 選項為 true,則內建但非標準的「unix-dotfile」VFS 將使用 utime() 系統呼叫,而不是 utimes(),來設定鎖定檔案的最後存取時間。

SQLITE_BYTEORDER=(0|1234|4321)

SQLite 需要知道目標 CPU 的原生位元組順序是大端序還是小端序。SQLITE_BYTEORDER 前置處理器在大端序機器上設定為 4321,在小端序機器上設定為 1234,或者可以設定為 0 表示必須在執行階段決定位元組順序。程式碼中有 #ifdef 可以自動為所有常見平台和編譯器設定 SQLITE_BYTEORDER。然而,在為特殊目標編譯 SQLite 時,適當地設定 SQLITE_BYTEORDER 可能會更有利。如果在編譯時無法確定目標位元組順序,則 SQLite 會退回到執行階段檢查,這總是有效,但會有些微的效能損失。

4. 設定預設參數值的選項

SQLITE_DEFAULT_AUTOMATIC_INDEX=<0 或 1>

此巨集決定新開啟資料庫連線PRAGMA automatic_index 的初始設定。對於 3.7.17 之前的所有 SQLite 版本,如果省略此編譯時選項,通常會為新的資料庫連線啟用自動索引。然而,這在未來的 SQLite 版本中可能會改變。

另請參閱:SQLITE_OMIT_AUTOMATIC_INDEX

SQLITE_DEFAULT_AUTOVACUUM=<0 或 1 或 2>

此巨集決定 SQLite 是否預設將資料庫的 auto_vacuum 旗標設定為 OFF (0)、FULL (1) 或 INCREMENTAL (2)。預設值為 0,表示建立資料庫時會關閉 auto-vacuum。在任何情況下,編譯時預設值都可以透過 PRAGMA auto_vacuum 命令覆寫。

SQLITE_DEFAULT_CACHE_SIZE=<N>

此巨集設定每個附加資料庫的頁面快取預設最大大小。正值表示限制為 N 頁。如果 N 為負數,則表示將快取大小限制為 -N*1024 位元組。建議的最大快取大小可以透過 PRAGMA cache_size 命令覆寫。預設值為 -2000,相當於每個快取最多 2048000 位元組。

SQLITE_DEFAULT_FILE_FORMAT=<1 或 4>

此巨集設定 SQLite 建立新資料庫檔案時使用的預設 結構描述格式編號。各種結構描述格式都非常相似。格式 1 和 4 之間的差異在於格式 4 支援 遞減索引,並且對布林值有更緊密的編碼。

自 3.3.0 (2006-01-10) 以來的所有 SQLite 版本都可以讀寫 1 到 4 之間的任何結構描述格式。但較舊版本的 SQLite 可能無法讀取大於 1 的格式。因此,為了讓較舊版本的 SQLite 能夠讀寫由較新版本的 SQLite 建立的資料庫檔案,SQLite 3.7.9 (2011-11-01) 之前的版本預設結構描述格式設定為 1。從 3.7.10 版 (2012-01-16) 開始,預設結構描述格式為 4。

新資料庫的結構描述格式編號可以在執行階段使用 PRAGMA legacy_file_format 命令設定。

SQLITE_DEFAULT_FILE_PERMISSIONS=N

在 Unix 系統下,新建立的資料庫檔案預設的數字檔案權限。如果未指定,預設值為 0644,這表示檔案可全局讀取,但只有建立者可以寫入。

SQLITE_DEFAULT_FOREIGN_KEYS=<0 或 1>

這個巨集決定了新資料庫連線預設是否啟用外鍵約束。每個資料庫連線都可以隨時使用 foreign_keys pragma 在執行期間開啟或關閉外鍵約束的強制執行。預設情況下,外鍵約束的強制執行通常是關閉的,但如果此編譯時參數設定為 1,則預設情況下會開啟外鍵約束的強制執行。

SQLITE_DEFAULT_MMAP_SIZE=N

這個巨集設定每個開啟的資料庫檔案用於記憶體映射 I/O 的記憶體量的預設限制。如果 *N* 為零,則預設情況下會停用記憶體映射 I/O。這個編譯時限制和 SQLITE_MAX_MMAP_SIZE 可以在啟動時使用 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) 呼叫修改,或在執行期間使用 mmap_size pragma 修改。

SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=<位元組數>

此選項設定回滾日誌檔案在持久日誌模式獨佔鎖定模式下的檔案大小限制,以及WAL 模式下預寫式日誌檔案的大小限制。省略此編譯時選項時,回滾日誌或預寫式日誌的大小沒有上限。日誌檔案大小限制可以在執行期間使用 journal_size_limit pragma 更改。

SQLITE_DEFAULT_LOCKING_MODE=<1 或 0>

如果設定為 1,則預設的 locking_mode 設定為 EXCLUSIVE。如果省略或設定為 0,則預設的 locking_mode 為 NORMAL。

SQLITE_DEFAULT_LOOKASIDE=SZ,N

旁視記憶體配置器 記憶體池的預設大小設定為 N 個 SZ 位元組的項目。此設定可以在啟動時使用 sqlite3_config(SQLITE_CONFIG_LOOKASIDE) 修改,和/或在開啟每個 資料庫連線 時使用 sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE) 修改。

SQLITE_DEFAULT_MEMSTATUS=<1 或 0>

這個巨集用於決定使用 sqlite3_config() 的 SQLITE_CONFIG_MEMSTATUS 參數啟用或停用的功能是否預設可用。預設值為 1(啟用 SQLITE_CONFIG_MEMSTATUS 相關功能)。

當記憶體使用量追蹤被停用時,sqlite3_memory_used()sqlite3_memory_highwater() 介面、sqlite3_status64(SQLITE_STATUS_MEMORY_USED) 介面以及 SQLITE_MAX_MEMORY 編譯時選項都將失效。

SQLITE_DEFAULT_PCACHE_INITSZ=N

當未使用 SQLITE_CONFIG_PAGECACHE 設定選項,而是從 sqlite3_malloc() 獲取頁面快取的記憶體時,這個巨集決定了頁面快取模組初始分配的頁面數量。此巨集設定的頁面數量會在單次分配中分配,從而減少記憶體配置器的負擔。

SQLITE_DEFAULT_PAGE_SIZE=<位元組數>

這個巨集用於設定建立資料庫時使用的預設頁面大小。指定的值必須是 2 的冪次方。預設值為 4096。編譯時預設值可以在執行期間被 PRAGMA page_size 命令覆蓋。

SQLITE_DEFAULT_SYNCHRONOUS=<0-3>

這個巨集決定了 PRAGMA synchronous 設定的預設值。如果在編譯時期沒有被覆寫,預設設定為 2 (FULL)。

SQLITE_DEFAULT_WAL_SYNCHRONOUS=<0-3>

這個巨集決定了以 WAL 模式 開啟的資料庫檔案的 PRAGMA synchronous 設定的預設值。如果在編譯時期沒有被覆寫,這個值與 SQLITE_DEFAULT_SYNCHRONOUS 相同。

如果 SQLITE_DEFAULT_WAL_SYNCHRONOUS 與 SQLITE_DEFAULT_SYNCHRONOUS 不同,並且應用程式沒有使用 PRAGMA synchronous 陳述式修改資料庫檔案的同步設定,那麼當資料庫連線第一次切換到 WAL 模式時,同步設定會更改為 SQLITE_DEFAULT_WAL_SYNCHRONOUS 定義的值。如果 SQLITE_DEFAULT_WAL_SYNCHRONOUS 值在編譯時期沒有被覆寫,那麼它將始終與 SQLITE_DEFAULT_SYNCHRONOUS 相同,因此永遠不會發生自動同步設定更改。

SQLITE_DEFAULT_WAL_AUTOCHECKPOINT=<頁數>

這個巨集設定 WAL 自動檢查點 功能的預設頁數。如果未指定,預設頁數為 1000。

SQLITE_DEFAULT_WORKER_THREADS=N

這個巨集設定 SQLITE_LIMIT_WORKER_THREADS 參數的預設值。SQLITE_LIMIT_WORKER_THREADS 參數設定單個 已準備好的陳述式 將啟動以協助其查詢的輔助執行緒的最大數量。如果未指定,預設最大值為 0。這裡設定的值不能超過 SQLITE_MAX_WORKER_THREADS

SQLITE_DQS=N

這個巨集決定了 SQLITE_DBCONFIG_DQS_DDLSQLITE_DBCONFIG_DQS_DML 的預設值,而這些值又決定了 SQLite 如何處理每個 雙引號字串字面值。「DQS」名稱代表「Double-Quoted String」。N 參數應為整數 0、1、2 或 3。

SQLITE_DQS允許雙引號字串備註
在 DDL 中在 DML 中
3預設
2 
1 
0建議

建議的設定為 0,表示在所有情況下都不允許使用雙引號字串。但是,為了與舊版應用程式最大程度地相容,預設設定為 3。

SQLITE_EXTRA_DURABLE

SQLITE_EXTRA_DURABLE 編譯時期選項過去會導致預設的 PRAGMA synchronous 設定為 EXTRA,而不是 FULL。此選項已不再支援。請改用 SQLITE_DEFAULT_SYNCHRONOUS=3

SQLITE_FTS3_MAX_EXPR_DEPTH=N

這個巨集設定 FTS3FTS4 全文索引中 MATCH 運算子右側對應的搜尋樹的最大深度。全文搜尋使用遞迴演算法,因此樹的深度受到限制,以防止使用過多的堆疊空間。預設限制為 12。此限制足以容納 MATCH 運算子右側最多 4095 個搜尋詞,並且將堆疊空間使用量保持在 2000 位元組以下。

對於一般的 FTS3/FTS4 查詢,搜尋樹深度大約是 MATCH 運算子右側詞語數量的以 2 為底的對數。但是,對於 片語查詢NEAR 查詢,搜尋樹深度與右側詞語的數量成線性關係。因此,預設深度限制 12 足以容納 MATCH 上最多 4095 個普通詞語,但僅足以容納 11 或 12 個片語或 NEAR 詞語。即便如此,預設值對於大多數應用程式來說已經綽綽有餘。

SQLITE_JSON_MAX_DEPTH=N

這個巨集設定 JSON 物件和陣列的最大巢狀深度。預設值為 1000。

JSON SQL 函式使用遞迴下降剖析器。這表示深度巢狀的 JSON 可能需要大量的堆疊空間來剖析。在堆疊空間有限的系統上,可以將 SQLite 編譯成大幅降低的最大 JSON 巢狀深度,以避免堆疊溢位的可能性,即使是來自惡意的輸入。即使對於最複雜的實際 JSON,值為 10 或 20 通常就足夠了。

SQLITE_LIKE_DOESNT_MATCH_BLOBS

這個編譯時期選項會導致 LIKE 運算子在任一運算元是 BLOB 時一律返回 False。 LIKE 的預設行為是在進行比較之前將 BLOB 運算元轉換為 TEXT。

這個編譯時期選項使 SQLite 在處理使用 LIKE 運算子的查詢時運行更有效率,但代價是破壞向後相容性。然而,向後相容性的破壞可能只是一個技術問題。 LIKE 處理邏輯中存在一個長期存在的錯誤(參見 https://www.sqlite.org/src/info/05f43be8fdda9f),導致它在處理 BLOB 運算元時發生錯誤行為,並且在近 10 年的實際使用中沒有人發現該錯誤。因此,對於大多數使用者來說,啟用此編譯時期選項並因此在 LIKE 查詢中節省一些 CPU 時間可能是安全的。

此編譯時期選項僅影響 SQL LIKE 運算子,並且對 sqlite3_strlike() C 語言介面沒有影響。

SQLITE_MAX_MEMORY=N

此選項將 SQLite 從 malloc() 請求的記憶體總量限制為 N 位元組。任何 SQLite 嘗試分配新記憶體,導致 SQLite 持有的所有分配總和超過 N 位元組的行為都將導致記憶體不足錯誤。這是一個硬性上限。另請參閱 sqlite3_soft_heap_limit() 介面。

此選項是已分配記憶體總量的限制。有關任何單個記憶體分配中允許的記憶體量的限制,請參閱 SQLITE_MAX_ALLOCATION_SIZE 選項。

僅當可通過 sqlite3_memory_used()sqlite3_status64(SQLITE_STATUS_MEMORY_USED) 介面獲得記憶體使用情況統計資訊時,此限制才有效。如果沒有該記憶體使用情況資訊,SQLite 無法知道何時將超過限制,因此無法阻止過多的記憶體分配。記憶體使用情況追蹤預設為開啟,但可以使用 SQLITE_DEFAULT_MEMSTATUS 選項在編譯時期停用,或使用 sqlite3_config(SQLITE_CONFIG_MEMSTATUS) 在啟動時停用。

SQLITE_MAX_MMAP_SIZE=N

這個巨集設定任何單個資料庫用於記憶體映射 I/O 的位址空間量的硬性上限。將此值設定為 0 將完全停用記憶體映射 I/O,並導致與記憶體映射 I/O 相關的邏輯從建置中省略。只要其他設定值小於此處定義的最大值,此選項就會更改預設的記憶體映射 I/O 位址空間大小(由 SQLITE_DEFAULT_MMAP_SIZE 或 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) 設定)或執行時期的記憶體映射 I/O 位址空間大小(由 sqlite3_file_control(SQLITE_FCNTL_MMAP_SIZE) 或 PRAGMA mmap_size 設定)。

SQLITE_MAX_SCHEMA_RETRY=N

每當資料庫結構描述變更時,準備好的陳述式會自動重新準備以適應新的結構描述。這裡存在一種競爭條件,即如果一個執行緒不斷更改結構描述,另一個執行緒可能會在重新剖析和重新準備已準備好的陳述式上不斷迴圈,而永遠無法完成任何實際工作。此參數透過強制迴圈的執行緒在嘗試重新編譯已準備好的陳述式固定次數後放棄,來防止無限迴圈。預設設定為 50,這對於大多數應用程式來說已綽綽有餘。

SQLITE_MAX_WORKER_THREADS=N

設定 sqlite3_limit(db,SQLITE_LIMIT_WORKER_THREADS,N) 設定的上限,該設定決定單個 已準備好的陳述式 將用於輔助 CPU 密集型計算(主要是排序)的輔助執行緒的最大數量。另請參閱 SQLITE_DEFAULT_WORKER_THREADS 選項。

SQLITE_MEMDB_DEFAULT_MAXSIZE=N

設定使用 sqlite3_deserialize() 建立的記憶體資料庫的預設大小限制(以位元組為單位)。這只是預設值。可以使用 sqlite3_config(SQLITE_CONFIG_MEMDB_MAXSIZE,N) 在啟動時更改限制,或使用 SQLITE_FCNTL_SIZE_LIMIT 檔案控制 在執行時為個別資料庫更改限制。如果未指定預設值,則使用 1073741824。

SQLITE_MINIMUM_FILE_DESCRIPTOR=N

Unix 虛擬檔案系統 (VFS) 永遠不會使用小於 N 的檔案描述符。N 的預設值為 3。

避免使用編號較小的檔案描述符是防止資料庫意外損毀的防禦措施。例如,如果使用檔案描述符 2 開啟了一個資料庫檔案,然後 assert() 失敗並呼叫 write(2,...),則可能會透過使用 assertion 錯誤訊息覆蓋部分資料庫檔案而導致資料庫損毀。僅使用值較大的檔案描述符可避免此潛在問題。可以透過將此編譯時選項設定為 0 來停用針對使用編號較小的檔案描述符的保護。

SQLITE_POWERSAFE_OVERWRITE=<0 或 1>

此選項會更改 Unix 和 Windows 虛擬檔案系統 (VFS) 底層檔案系統的 電源安全覆寫 的預設假設。將 SQLITE_POWERSAFE_OVERWRITE 設定為 1 會使 SQLite 假設應用程式層級的寫入即使在斷電前發生,也不會更改寫入位元組範圍之外的位元組。將 SQLITE_POWERSAFE_OVERWRITE 設定為 0 時,SQLite 假設與已寫入位元組位於同一扇區中的其他位元組可能會因斷電而更改或損毀。

SQLITE_PRINTF_PRECISION_LIMIT=N

此選項限制 printf() SQL 函式 和其他 C 語言字串格式化函式(例如 sqlite3_mprintf()sqlite3_str_appendf())的替代項的最大寬度和精確度。反過來,這可以防止惡意或故障的指令碼透過呼叫如下格式來使用過多的記憶體:printf('%*s',2147483647,'hi')N 的值大約為 100000 通常就足夠了。

printf() SQL 函式sqlite3_limit()SQLITE_LIMIT_LENGTH 限制的約束。因此,任何寬度或精確度超過 SQLITE_LIMIT_LENGTH 的 printf() 結果都會導致 SQLITE_TOOBIG 錯誤。但是,printf() 函式的低階格式化是由一個子常式完成的,該子常式無法存取 SQLITE_LIMIT_LENGTH。因此,低階格式化會寫入到可能遠大於 SQLITE_LIMIT_LENGTH 的記憶體配置中,並且僅在所有格式化完成後才執行 SQLITE_LIMIT_LENGTH 檢查。因此,可能存在一個超過 SQLITE_LIMIT_LENGTH 的暫時緩衝區。SQLITE_PRINTF_PRECISION_LIMIT 選項是一個額外的檢查,可防止在 SQLITE_LIMIT_LENGTH 檢查之前,低階格式化子常式內使用的暫時緩衝區大小過大。

請注意不要將 SQLITE_PRINTF_PRECISION_LIMIT 設定得太低。SQLite 使用其內建的 printf() 功能來格式化儲存在 sqlite_schema 資料表 中的 CREATE 陳述式文字。因此,SQLITE_PRINTF_PRECISION_LIMIT 應該至少與您可能遇到的最大資料表、索引、檢視或觸發器定義的大小相同。

如果寬度或精度超過 SQLITE_PRINTF_PRECISION_LIMIT,則不會引發錯誤。而是靜默地截斷過大的寬度或精度。

SQLITE_PRINTF_PRECISION_LIMIT 的預設值為 2147483647 (0x7fffffff)。

SQLITE_QUERY_PLANNER_LIMIT=N

在查詢規劃過程中,SQLite 會列舉索引和 WHERE 子句約束條件的所有可用組合。對於某些病態查詢,這些索引和約束條件組合的數量可能會非常大,導致查詢規劃器的效能變慢。SQLITE_QUERY_PLANNER_LIMIT 值(與相關的 SQLITE_QUERY_PLANNER_LIMIT_INCR 設定一起使用)限制了查詢規劃器會考慮的索引和約束條件組合的數量,以防止查詢規劃器使用過多的 CPU 時間。SQLITE_QUERY_PLANNER_LIMIT 的預設值設定得足夠高,因此在實際查詢中永遠不會達到。查詢規劃器搜尋限制僅適用於刻意設計成使用過多規劃時間的查詢。

SQLITE_QUERY_PLANNER_LIMIT_INCR=N

SQLITE_QUERY_PLANNER_LIMIT 選項設定查詢規劃器考慮的最大索引和約束條件組合數量的初始基準值。在處理聯結的每個資料表之前,基準查詢規劃器限制會增加 SQLITE_QUERY_PLANNER_LIMIT_INCR,以便保證每個資料表都能向最佳化器提出至少一些索引和約束條件組合,即使聯結之前的資料表已耗盡基準限制。此編譯時選項和 SQLITE_QUERY_PLANNER_LIMIT 選項的預設值都設定得足夠高,因此在實際查詢中永遠不會達到。

SQLITE_REVERSE_UNORDERED_SELECTS

此選項會導致預設啟用 PRAGMA reverse_unordered_selects 設定。啟用後,缺少 ORDER BY 子句的 SELECT 陳述式將以相反順序執行。

此選項可用於偵測應用程式(錯誤地)假設沒有 ORDER BY 子句的 SELECT 中的資料列順序將始終相同的情況。

SQLITE_SORTER_PMASZ=N

如果透過 PRAGMA threads 設定啟用多執行緒處理,則當要排序的內容量超過 cache_size 和由 SQLITE_CONFIG_PMASZ 啟動時選項決定的 PMA 大小的最小值時,排序操作將嘗試啟動輔助執行緒。此編譯時選項設定 SQLITE_CONFIG_PMASZ 啟動時選項的預設值。預設值為 250。

SQLITE_STMTJRNL_SPILL=N

SQLITE_STMTJRNL_SPILL 編譯時選項決定 SQLITE_CONFIG_STMTJRNL_SPILL 啟動時設定的預設值。該設定決定 陳述式日誌 從記憶體移至磁碟的閾值大小。

SQLITE_WIN32_MALLOC

此選項啟用使用 Windows 堆積 API 函式進行記憶體配置,而不是標準程式庫 malloc() 和 free() 常式。

YYSTACKDEPTH=<max_depth>

此巨集設定 SQLite 中 SQL 解析器使用的 LALR(1) 堆疊的最大深度。預設值為 100。典型的應用程式將使用少於約 20 個堆疊層級。如果開發人員的應用程式中包含需要超過 100 個 LALR(1) 堆疊項目的 SQL 陳述式,則應認真考慮重構其 SQL,因為這可能遠遠超出任何人的理解能力。

5. 設定大小限制的選項

有一些編譯時期選項可以設定 SQLite 中各種結構大小的上限。編譯時期選項通常設定一個硬性上限,可以使用 sqlite3_limit() 介面在個別資料庫連線的執行時期更改。

用於設定上限的編譯時期選項已另行說明。以下是可用設定的列表:

也有一些大小限制無法使用 sqlite3_limit() 修改。例如:

6. 控制操作特性的選項

SQLITE_4_BYTE_ALIGNED_MALLOC

在大部分系統上,malloc() 系統呼叫會返回一個以 8 位元組邊界對齊的緩衝區。但在某些系統上(例如:Windows),malloc() 會返回 4 位元組對齊的指標。此編譯時期選項必須用於從 malloc() 返回 4 位元組對齊指標的系統。

SQLITE_CASE_SENSITIVE_LIKE

如果存在此選項,則內建的 LIKE 運算子將區分大小寫。使用 case_sensitive_like pragma 可以在執行時期達到相同的效果。

SQLITE_DIRECT_OVERFLOW_READ

當存在此選項時,在讀取交易期間,資料庫檔案溢位頁面中包含的內容會直接從磁碟讀取,繞過頁面快取。在大量讀取大型 BLOB 或字串的應用程式中,此選項可以提高讀取效能。

從 3.45.0 版(2024-01-15)開始,此選項預設為啟用。要停用它,請使用 -DSQLITE_DIRECT_OVERFLOW_READ=0。

SQLITE_HAVE_ISNAN

如果存在此選項,則 SQLite 將使用系統數學庫中的 isnan() 函式。這是 HAVE_ISNAN 設定選項的別名。

SQLITE_MAX_ALLOCATION_SIZE=N

此編譯時期選項設定使用 sqlite3_malloc64()sqlite3_realloc64() 等請求的記憶體配置大小上限。預設值為 2,147,483,391 (0x7ffffeff),這應被視為上限。大多數應用程式可以使用幾百萬位元組的最大配置大小。

這是任何單個記憶體配置的最大大小限制。它_不是_已配置記憶體總量的限制。有關已配置記憶體總量的限制,請參閱 SQLITE_MAX_MEMORY

降低個別記憶體配置的最大大小,可提供額外的防禦,防止試圖透過執行許多大型配置來耗盡系統記憶體的阻斷服務攻擊。它也是針對應用程式錯誤的額外防禦層,其中記憶體配置的大小是使用可能溢位的帶符號 32 位元整數計算的 → 使用小的最大配置大小,由於記憶體不足錯誤,此類錯誤的記憶體配置大小計算可能會更早被發現,並且在整數實際溢位之前。

SQLITE_OS_OTHER=<0 或 1>

這個選項會讓 SQLite 省略其內建的 Unix、Windows 和 OS/2 作業系統介面。生成的程式庫將沒有預設的作業系統介面。應用程式必須在使用 SQLite 之前使用 sqlite3_vfs_register() 註冊一個適當的介面。應用程式還必須提供 sqlite3_os_init()sqlite3_os_end() 介面的實作。通常的做法是由提供的 sqlite3_os_init() 呼叫 sqlite3_vfs_register()。SQLite 初始化時會自動呼叫 sqlite3_os_init()

此選項通常用於為具有自定義作業系統的嵌入式平台建置 SQLite 時。

SQLITE_SECURE_DELETE

此編譯時期選項會更改 secure_delete pragma 的預設設定。未使用此選項時,secure_delete 預設為關閉。使用此選項時,secure_delete 預設為開啟。

secure_delete 設定會導致已刪除的內容被零覆寫。由於必須執行額外的 I/O,因此會產生些微的效能損失。另一方面,secure_delete 可以防止敏感資訊的片段在刪除後殘留在資料庫檔案未使用的部分。有關更多資訊,請參閱 secure_delete pragma 的說明文件。

SQLITE_THREADSAFE=<0 或 1 或 2>

此選項控制是否在 SQLite 中包含程式碼,以使其能夠在多執行緒環境中安全地運作。預設值是 SQLITE_THREADSAFE=1,可在多執行緒環境中安全使用。使用 SQLITE_THREADSAFE=0 編譯時,會省略所有互斥程式碼,並且在多執行緒程式中使用 SQLite 是不安全的。使用 SQLITE_THREADSAFE=2 編譯時,只要沒有兩個執行緒嘗試同時使用相同的 資料庫連線(或從該資料庫連線衍生的任何 預準備語句),就可以在多執行緒程式中使用 SQLite。

換句話說,SQLITE_THREADSAFE=1 將預設的 執行緒模式 設定為序列化。SQLITE_THREADSAFE=2 將預設的 執行緒模式 設定為多執行緒。而 SQLITE_THREADSAFE=0 將 執行緒模式 設定為單執行緒。

可以使用 sqlite3_threadsafe() 介面在執行時期確定 SQLITE_THREADSAFE 的值。

當 SQLite 使用 SQLITE_THREADSAFE=1 或 SQLITE_THREADSAFE=2 編譯時,可以使用 sqlite3_config() 介面以及以下其中一個動詞在執行時期更改 執行緒模式

SQLITE_OPEN_NOMUTEXSQLITE_OPEN_FULLMUTEX 旗標到 sqlite3_open_v2() 也可用於在執行時期調整個別 資料庫連線執行緒模式

請注意,當 SQLite 使用 SQLITE_THREADSAFE=0 編譯時,使 SQLite 執行緒安全的程式碼會從建置中省略。發生這種情況時,無法在啟動時或執行時期更改 執行緒模式

有關在多執行緒環境中使用 SQLite 的其他資訊,請參閱 執行緒模式 文件。

SQLITE_TEMP_STORE=<0 到 3>

此選項控制暫存檔案是儲存在磁碟上還是記憶體中。此編譯時期選項的各種設定的含義如下:

SQLITE_TEMP_STORE含義
0始終使用暫存檔案
1預設使用檔案,但允許 PRAGMA temp_store 命令覆寫
2預設使用記憶體,但允許 PRAGMA temp_store 命令覆寫
3始終使用記憶體

預設設定為 1。更多資訊請參閱 tempfiles.html

SQLITE_TRACE_SIZE_LIMIT=N

如果這個巨集被定義為正整數 N,那麼在 sqlite3_trace() 輸出中展開為參數的字串和 BLOB 的長度將被限制為 N 位元組。

SQLITE_TRUSTED_SCHEMA=<0 或 1>

這個巨集決定了 SQLITE_DBCONFIG_TRUSTED_SCHEMAPRAGMA trusted_schema 設定的預設值。如果沒有指定替代方案,為了向下相容,trusted-schema 設定預設為開啟(值為 1)。然而,為了最佳安全性,實作了 應用程式定義的 SQL 函式 和/或 虛擬表格 的系統應該考慮將預設值更改為關閉。

SQLITE_USE_URI

這個選項會預設啟用 URI 檔案名稱 處理邏輯。

7. 啟用通常關閉的功能的選項

SQLITE_ALLOW_URI_AUTHORITY

URI 檔案名稱 通常在授權部分不是空的或 "localhost" 時會拋出錯誤。但是,如果 SQLite 是使用 SQLITE_ALLOW_URI_AUTHORITY 編譯時期選項編譯的,則 URI 會被轉換為統一命名慣例 (UNC) 檔案名稱,並以這種方式傳遞到底層作業系統。

SQLite 的某些未來版本可能會改為預設啟用此功能。

SQLITE_ALLOW_COVERING_INDEX_SCAN=<0 或 1>

這個 C 前置處理器巨集決定了 SQLITE_CONFIG_COVERING_INDEX_SCAN 設定的預設值。它預設為 1(開啟),這表示覆蓋索引會盡可能用於完整表格掃描,以減少 I/O 並提升效能。然而,將覆蓋索引用於完整掃描會導致結果以與舊版不同的順序出現,這可能會導致某些(編碼不正確的)舊版應用程式損壞。因此,在希望盡量減少暴露舊版應用程式錯誤風險的系統上,可以在編譯時期停用覆蓋索引掃描選項。

SQLITE_ENABLE_8_3_NAMES=<1 或 2>

如果定義了這個 C 前置處理器巨集,則會包含額外的程式碼,允許 SQLite 在僅支援 8+3 檔案名稱的檔案系統上運作。如果這個巨集的值為 1,則預設行為是繼續使用長檔案名稱,並且僅在使用帶有 "8_3_names=1" 查詢參數的 URI 檔案名稱 開啟資料庫連線時才使用 8+3 檔案名稱。如果這個巨集的值為 2,則使用 8+3 檔案名稱成為預設值,但可以使用8_3_names=0查詢參數停用。

SQLITE_ENABLE_API_ARMOR

定義時,這個 C 前置處理器巨集會啟用額外的程式碼,嘗試偵測 SQLite API 的誤用,例如將 NULL 指標傳遞給必要的參數或在物件被銷毀後使用它們。當啟用此選項並偵測到非法的 API 使用時,介面通常會返回 SQLITE_MISUSE。

SQLITE_ENABLE_API_ARMOR 選項不保證所有非法的 API 使用都會被偵測到。即使啟用了 SQLITE_ENABLE_API_ARMOR,將不正確的值傳遞到 C 語言 API 也可能由於區段錯誤或空指標取值或其他原因導致程式當機。SQLITE_ENABLE_API_ARMOR 編譯時期選項旨在作為應用程式測試和除錯選項的輔助工具。應用程式不應依賴 SQLITE_ENABLE_API_ARMOR 來確保安全。SQLITE_ENABLE_API_ARMOR 適合作為防止應用程式錯誤的第二道防線,但不應該是唯一的防線。如果有任何 SQLite 介面返回 SQLITE_MISUSE,則表示應用程式正在以違反規範的方式使用 SQLite,並且應用程式包含錯誤。SQLITE_MISUSE 返回值讓應用程式有機會優雅地應對該錯誤,而不是簡單地使程式當機或引發未定義的行為,但僅此而已。應用程式不應將 SQLITE_MISUSE 用於常規處理,也不應依賴它。

SQLITE_ENABLE_ATOMIC_WRITE

如果定義了這個 C 預處理器巨集,並且如果資料庫檔案的 sqlite3_io_methods 物件的 xDeviceCharacteristics 方法(透過其中一個 SQLITE_IOCAP_ATOMIC 位元)回報檔案系統支援原子寫入,並且如果一個事務只涉及更改資料庫檔案的單一頁面,則該事務只用單一頁面的單一寫入請求提交,並且不會建立或寫入回滾日誌。在支援原子寫入的檔案系統上,這種優化可以顯著提高小型更新的速度。然而,很少有檔案系統支援此功能,而且在缺乏原子寫入功能的系統上,檢查此功能的程式碼路徑會降低寫入效能,因此預設情況下會停用此功能。

SQLITE_ENABLE_BATCH_ATOMIC_WRITE

此編譯時期選項讓 SQLite 能夠利用底層檔案系統中的批次原子寫入功能。從 SQLite 3.21.0 版 (2017-10-24) 開始,此功能僅在 F2FS 上支援。然而,該介面是使用 sqlite3_file_control()SQLITE_FCNTL_BEGIN_ATOMIC_WRITESQLITE_FCNTL_COMMIT_ATOMIC_WRITE 泛型實現的,因此未來可以將此功能新增到其他檔案系統。當啟用此選項時,SQLite 會自動偵測底層檔案系統是否支援批次原子寫入,如果支援,它就會避免寫入用於事務控制的 回滾日誌。這可以使事務速度提高一倍以上,同時減少 SSD 儲存裝置的磨損。

未來版本的 SQLite 可能會預設啟用批次原子寫入功能,屆時此編譯時期選項將變得多餘。

SQLITE_ENABLE_BYTECODE_VTAB

此選項啟用 位元組碼和 tables_used 虛擬表格

SQLITE_ENABLE_COLUMN_METADATA

當定義此 C 預處理器巨集時,SQLite 會包含一些額外的 API,提供方便存取表格和查詢中繼資料的功能。此選項啟用的 API 為

SQLITE_ENABLE_DBPAGE_VTAB

此選項啟用 SQLITE_DBPAGE 虛擬表格

SQLITE_ENABLE_DBSTAT_VTAB

此選項啟用 dbstat 虛擬表格

SQLITE_ENABLE_DESERIALIZE

此選項以前用於啟用 sqlite3_serialize()sqlite3_deserialize() 介面。但是,從 SQLite 3.36.0 (2021-06-18) 開始,這些介面預設為啟用狀態,並新增了一個新的編譯時期選項 SQLITE_OMIT_DESERIALIZE 來省略它們。

SQLITE_ENABLE_EXPLAIN_COMMENTS

此選項會在 SQLite 中新增額外邏輯,將註釋文字插入 EXPLAIN 的輸出中。這些額外註釋會使用額外的記憶體,從而使 預編譯語句 更大且速度稍慢,因此預設情況下以及在大部分應用程式中都會關閉它們。但是,某些應用程式(例如 SQLite 的 命令列 shell)重視 EXPLAIN 輸出的清晰度而不是原始效能,因此可以使用此編譯時期選項。如果啟用了 SQLITE_DEBUG,也會自動啟用 SQLITE_ENABLE_EXPLAIN_COMMENTS 編譯時期選項。

SQLITE_ENABLE_FTS3

當在 合併檔案 中定義此選項時,會自動將全文檢索引擎的版本 3 和 4 新增到建置中。

SQLITE_ENABLE_FTS3_PARENTHESIS

此選項會修改 FTS3 中的查詢模式剖析器,使其支援 AND 和 NOT 運算子(除了常用的 OR 和 NEAR 之外),並且允許查詢表達式包含巢狀括號。

SQLITE_ENABLE_FTS3_TOKENIZER

這個選項啟用了 fts3_tokenizer() 介面的雙參數版本。fts3_tokenizer() 的第二個參數應該是指向一個函數的指標(編碼為 BLOB),該函數實現了一個應用程式定義的 tokenizer。如果惡意行為者能夠使用任意第二個參數執行 fts3_tokenizer() 的雙參數版本,他們可能會導致程式崩潰或控制程式。

由於安全性考量,從 3.11.0 版 (2016-02-15) 開始,除非使用此編譯時期選項,否則會停用雙參數 fts3_tokenizer() 功能。3.12.0 版 (2016-03-29) 新增了 sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER,1,0) 介面,可在執行時期為特定 資料庫連線 啟用 fts3_tokenizer() 的雙參數版本。

SQLITE_ENABLE_FTS4

當在 合併檔案 中定義此選項時,會自動將全文檢索引擎的版本 3 和 4 新增到建置中。

SQLITE_ENABLE_FTS5

當在 合併檔案 中定義此選項時,全文檢索引擎的第 5 版 (fts5) 會自動新增到建置中。

SQLITE_ENABLE_GEOPOLY

當在 合併檔案 中定義此選項時,Geopoly 延伸模組 會包含在建置中。

SQLITE_ENABLE_HIDDEN_COLUMNS

當在 合併檔案 中定義此選項時,虛擬表格的 隱藏欄位 功能會啟用。

SQLITE_ENABLE_ICU

此選項會將 Unicode 國際元件 或「ICU」延伸模組新增到 SQLite 的建置中。

SQLITE_ENABLE_IOTRACE

當 SQLite 核心和 命令列介面 (CLI) 都使用此選項編譯時,CLI 會提供一個名為 ".iotrace" 的額外命令,提供 I/O 活動的低階日誌。此選項為實驗性質,未來版本中可能會移除。

SQLITE_ENABLE_MATH_FUNCTIONS

這個巨集啟用了 內建的 SQL 數學函式。除非使用 --disable-math 選項,否則 Unix 平台上的 configure 腳本會自動將此選項新增到 Makefile 中。使用 nmake 的 "Makefile.msc" makefile 的 Windows 建置也包含此選項。

SQLITE_ENABLE_JSON1

這個編譯時期選項是一個無操作選項。在 SQLite 3.38.0 版 (2022-02-22) 之前,需要使用此選項進行編譯才能將 JSON SQL 函式 包含在建置中。但是,從 SQLite 3.38.0 版開始,預設會包含這些函式。使用 -DSQLITE_OMIT_JSON 選項將其省略。

SQLITE_ENABLE_LOCKING_STYLE

此選項會在 Mac OS X 的作業系統介面層中啟用額外邏輯。額外邏輯會嘗試判斷底層檔案系統的類型,並選擇適用於該檔案系統類型的替代鎖定策略。共有五種鎖定策略可用:

除了預設的實作外,還額外提供了五種 虛擬檔案系統 (VFS) 實作。應用程式可以在呼叫 sqlite3_open_v2() 時指定其中一種額外的 VFS 實作,以略過檔案系統偵測邏輯並明確選擇上述其中一種鎖定模式。這五種額外的 VFS 實作分別稱為 "unix-posix"、"unix-afp"、"unix-flock"、"unix-dotfile" 和 "unix-none"。

SQLITE_ENABLE_MEMORY_MANAGEMENT

此選項會在 SQLite 中加入額外的邏輯,允許它在收到請求時釋放未使用的記憶體。必須啟用此選項,sqlite3_release_memory() 介面才能正常運作。如果未啟用此編譯時期選項,sqlite3_release_memory() 介面將不會執行任何動作。

SQLITE_ENABLE_MEMSYS3

此選項會在 SQLite 中包含一個替代記憶體配置器的程式碼。僅當使用 sqlite3_config()SQLITE_CONFIG_HEAP 選項提供一大塊記憶體,並從中進行所有記憶體配置時,才會啟用此替代記憶體配置器。MEMSYS3 記憶體配置器使用一種混合配置演算法,其模式參考自 dlmalloc()。SQLITE_ENABLE_MEMSYS3 和 SQLITE_ENABLE_MEMSYS5 只能擇一啟用。

SQLITE_ENABLE_MEMSYS5

此選項會在 SQLite 中包含一個替代記憶體配置器的程式碼。僅當使用 sqlite3_config()SQLITE_CONFIG_HEAP 選項提供一大塊記憶體,並從中進行所有記憶體配置時,才會啟用此替代記憶體配置器。MEMSYS5 模組會將所有配置的大小向上調整至下一個 2 的次方,並使用首次適配 (first-fit) 的夥伴配置器 (buddy-allocator) 演算法,在特定操作限制下,提供強大的防範碎片化和崩潰的保證。

SQLITE_ENABLE_NORMALIZE

此選項包含 sqlite3_normalized_sql() API。

SQLITE_ENABLE_NULL_TRIM

此選項啟用一項最佳化功能,會省略資料列結尾的 NULL 值欄位,以節省磁碟空間。

使用此選項啟用所產生的資料庫無法被 SQLite 3.1.6 版 (2005-03-17) 和更早版本讀取。此外,使用此選項啟用所產生的資料庫容易觸發 sqlite3_blob_reopen() 介面中的 e6e962d6b0f06f46 錯誤。基於這些原因,此最佳化功能預設為停用。然而,在未來的 SQLite 版本中,此最佳化功能可能會預設啟用。

SQLITE_ENABLE_OFFSET_SQL_FUNC

此選項啟用對 sqlite_offset(X) SQL 函數的支援。

sqlite_offset(X) SQL 函數需要 B 樹儲存引擎上的新介面、執行 SQL 陳述式的 虛擬機器 中的新操作碼,以及程式碼產生器關鍵路徑中的新條件式。為了避免在不需要 sqlite_offset(X) 功能的應用程式中產生額外負擔,此函數預設為停用。

SQLITE_ENABLE_PREUPDATE_HOOK

此選項啟用 數個新的 API,這些 API 會在對 rowid 表格 進行任何更改之前提供回呼。這些回呼可用於記錄更改發生之前的資料列狀態。

preupdate hook 的作用類似於 update hook,不同之處在於回呼是在更改之前而不是之後被呼叫,而且除非啟用此編譯時期選項,否則 preupdate hook 介面將被省略。

preupdate hook 介面最初是为了支援 session 擴充功能而新增的。

SQLITE_ENABLE_QPSG

這個選項會使 查詢規劃器穩定性保證 (QPSG) 預設為開啟狀態。通常 QPSG 是關閉的,必須在執行期間使用 SQLITE_DBCONFIG_ENABLE_QPSG 選項搭配 sqlite3_db_config() 介面來啟動。

SQLITE_ENABLE_RBU

啟用實作 RBU 延伸 的程式碼。

SQLITE_ENABLE_RTREE

這個選項會讓 SQLite 包含對 R*Tree 索引延伸 的支援。

SQLITE_ENABLE_SESSION

這個選項會啟用 session 延伸

SQLITE_ENABLE_SNAPSHOT

這個選項會啟用支援 sqlite3_snapshot 物件及其相關介面的程式碼。

SQLITE_ENABLE_SORTER_REFERENCES

這個選項會啟動一項優化,以額外進行 B 樹搜尋為代價,減少排序器所需的記憶體。

預設的排序程序是將最終會輸出的所有資訊收集到一個「記錄」中,然後將完整的記錄傳遞給排序器。但在某些情況下,例如某些輸出欄位包含大型 BLOB 值時,每個記錄的大小可能會很大,這表示排序器必須使用更多記憶體,和/或將更多內容寫入到暫存儲存區。

啟用 SQLITE_ENABLE_SORTER_REFERENCES 時,傳遞給排序器的記錄通常只包含 ROWID 值。這樣的記錄要小得多。這表示排序器要處理的「有效負載」少得多,因此可以執行得更快。排序完成後,會使用 ROWID 在原始表格中查詢輸出欄位值。這需要再次搜尋表格,並可能導致速度變慢。或者,根據值的大小,它也可能提升效能。

即使 SQLITE_ENABLE_SORTER_REFERENCES 編譯時期選項已開啟,排序器參考預設仍為停用狀態。要使用排序器參考,應用程式必須在啟動時使用 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE) 介面設定排序器參考大小的閾值。

由於 SQLite 開發人員不知道 SQLITE_ENABLE_SORTER_REFERENCES 選項會提升還是降低效能,因此目前(2018-05-04)預設為停用狀態。在未來的版本中,根據其對效能影響的了解,可能會預設啟用。

SQLITE_ENABLE_STMT_SCANSTATUS

這個選項會啟用 sqlite3_stmt_scanstatus()sqlite3_stmt_scanstatus_v2() 介面。這些介面通常會從建置中省略,因為它們會造成效能損失,即使在不使用該功能的陳述式上也是如此。

SQLITE_ENABLE_STMTVTAB

這個編譯時期選項會啟用 SQLITE_STMT 虛擬表格 邏輯。

SQLITE_RTREE_INT_ONLY

這個編譯時期選項已被棄用且未經測試。

SQLITE_ENABLE_SQLLOG

這個選項啟用額外的程式碼(尤其是用於 sqlite3_config()SQLITE_CONFIG_SQLLOG 選項),可以用來建立應用程式執行所有 SQLite 處理的日誌。這些日誌可用於對應用程式行為進行離線分析,尤其適用於效能分析。為了使 SQLITE_ENABLE_SQLLOG 選項生效,需要一些額外的程式碼。SQLite 原始碼樹中的 「test_sqllog.c」 原始碼檔案就是所需額外程式碼的一個有效範例。在 Unix 和 Windows 系統上,開發人員可以將「test_sqllog.c」原始碼檔案的文字附加到「sqlite3.c」合併檔案的末尾,使用 -DSQLITE_ENABLE_SQLLOG 選項重新編譯應用程式,然後使用環境變數控制日誌記錄。有關更多詳細資訊,請參閱「test_sqllog.c」原始碼檔案的標頭註釋。

SQLITE_ENABLE_STAT2

此選項過去會使 ANALYZE 命令在 sqlite_stat2 表中收集索引直方圖數據。但自 SQLite 3.7.9 版(2011-11-01)起,該功能已被 SQLITE_ENABLE_STAT3 取代。 SQLITE_ENABLE_STAT2 編譯時選項現在已無作用。

SQLITE_ENABLE_STAT3

此選項過去會使 ANALYZE 命令在 sqlite_stat3 表中收集索引直方圖數據。但自 SQLite 3.8.1 版(2013-10-17)起,該功能已被 SQLITE_ENABLE_STAT4 取代。SQLITE_ENABLE_STAT3 編譯時選項在 3.29.0 版(2019-07-10)之前仍受支援,但現在已無作用。

SQLITE_ENABLE_STAT4

此選項為 ANALYZE 命令和 查詢規劃器 添加了額外邏輯,可以幫助 SQLite 在某些情況下選擇更好的查詢計劃。ANALYZE 命令得到增強,可以從每個索引的所有欄位收集直方圖數據,並將這些數據儲存在 sqlite_stat4 表中。查詢規劃器隨後將使用直方圖數據來幫助其做出更好的索引選擇。此編譯時選項的缺點是它違反了 查詢規劃器穩定性保證,使得在大規模生產的應用程式中確保一致的效能更加困難。

SQLITE_ENABLE_STAT4 是對 SQLITE_ENABLE_STAT3 的增強。STAT3 只記錄每個索引最左邊欄位的直方圖數據,而 STAT4 增強功能則記錄每個索引所有欄位的直方圖數據。SQLITE_ENABLE_STAT3 編譯時選項現在已無作用。

SQLITE_ENABLE_TREE_EXPLAIN

此編譯時選項已不再使用。

SQLITE_ENABLE_UPDATE_DELETE_LIMIT

此選項在 UPDATEDELETE 陳述式中啟用可選的 ORDER BY 和 LIMIT 子句。

如果定義了此選項,則在使用 Lemon 語法分析器產生器 工具產生 parse.c 檔案時也必須定義它。因此,此選項只能在從原始碼建置程式庫時使用,而不能在從 合併檔案 或從網站上為非 Unix 類平台提供的預先打包的 C 檔案集合中建置時使用。

SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION

當 SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION 編譯時選項啟用時,SQLite 將在執行 EXPLAINEXPLAIN QUERY PLAN 時抑制「未知函式」錯誤。SQLite 不會拋出錯誤,而是會插入一個名為「unknown()」的替代無操作函式。僅在 EXPLAINEXPLAIN QUERY PLAN 上才會用「unknown()」取代無法辨識的函式,而不是在一般陳述式上。

命令列 shell中使用時,SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION 功能允許將包含應用程式定義函數的 SQL 文本貼上到 shell 中以進行分析和除錯,而無需建立並載入實作應用程式定義函數的擴充功能。

SQLITE_ENABLE_UNLOCK_NOTIFY

此選項啟用 sqlite3_unlock_notify() 介面及其相關功能。有關其他資訊,請參閱標題為 使用 SQLite 解鎖通知功能 的說明文件。

SQLITE_INTROSPECTION_PRAGMAS

此選項已過時。它過去用於啟用一些額外的 PRAGMA 陳述式,例如 PRAGMA function_listPRAGMA module_listPRAGMA pragma_list,但這些 PRAGMA 陳述式現在預設都是啟用的。請參閱 SQLITE_OMIT_INTROSPECTION_PRAGMAS

SQLITE_SOUNDEX

此選項啟用 soundex() SQL 函數

SQLITE_STRICT_SUBTYPE=1

此選項會導致應用程式定義的 SQL 函數在呼叫 sqlite3_result_subtype() 介面但未以 SQLITE_RESULT_SUBTYPE 屬性註冊時引發 SQL 錯誤。建議使用此選項,以便在開發週期的早期階段識別應用程式定義 SQL 函數實作中的問題。

SQLITE_USE_ALLOCA

如果啟用此選項,則 alloca() 記憶體配置器將在一些適當的情況下使用。這會產生稍微更小、更快的二進位檔。SQLITE_USE_ALLOCA 編譯時選項當然僅適用於支援 alloca() 的系統。

SQLITE_USE_FCNTL_TRACE

此選項會使 SQLite 發出額外的 SQLITE_FCNTL_TRACE 檔案控制,以向 VFS 提供補充資訊。「vfslog.c」擴充功能利用此功能提供增強的 VFS 活動記錄。

SQLITE_USE_SEH

此選項過去是用於切換現在由 SQLITE_OMIT_SEH 控制的功能。用戶端程式碼不應使用此定義,因為它是由程式庫內部使用的。

SQLITE_HAVE_ZLIB

此選項會使某些擴充功能連結到 zlib 壓縮程式庫

此選項對 SQLite 核心沒有影響。它僅供擴充功能使用。此選項對於 命令列 shellSQL 封存 支援所包含的壓縮和解壓縮函數是必要的。

使用此選項進行編譯時,通常需要新增連結器選項以將 zlib 程式庫包含在建置中。通常此選項為「-lz」,但在不同的系統上可能不同。

在 Windows 系統上使用 MSVC 進行建置時,可以將 zlib 原始程式碼放在原始程式碼樹狀結構的 compat/zlib 子目錄中,然後將 USE_ZLIB=1 選項新增到 nmake 命令中,以使 Makefile.msc 自動建置並使用適當的 zlib 程式庫實作。

YYTRACKMAXSTACKDEPTH

此選項會使 LALR(1) 解析器堆疊深度被追蹤並使用 sqlite3_status(SQLITE_STATUS_PARSER_STACK,...) 介面回報。SQLite 的 LALR(1) 解析器具有固定的堆疊深度(在編譯時使用 YYSTACKDEPTH 選項決定)。此選項可用於協助判斷應用程式是否接近超過最大 LALR(1) 堆疊深度。

8. 停用通常開啟的功能的選項

SQLITE_DISABLE_LFS

如果定義了此 C 預處理器巨集,則會停用大型檔案支援。

SQLITE_DISABLE_DIRSYNC

如果定義了此 C 預處理器巨集,則會停用目錄同步。SQLite 通常會在刪除檔案時嘗試同步父目錄,以確保目錄項目立即在磁碟上更新。

SQLITE_DISABLE_FTS3_UNICODE

如果定義了此 C 預處理器巨集,則 FTS3 中的 unicode61 分詞器將從建置中省略,並且應用程式無法使用。

SQLITE_DISABLE_FTS4_DEFERRED

如果這個 C 預處理器巨集停用了 FTS4 中的「延遲詞彙」優化。「延遲詞彙」優化避免載入集合中大多數文件中出現的詞彙的大量發佈清單,而是直接在文件來源中掃描這些詞彙。無論是否使用此優化,FTS4 應該得到完全相同的答案。

SQLITE_DISABLE_INTRINSIC

此選項停用編譯器特定的內建函數,例如 GCC 和 Clang 中的 __builtin_bswap32() 和 __builtin_add_overflow(),或 MSVC 中的 _byteswap_ulong() 和 _ReadWriteBarrier()。

SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS

此選項停用 sqlite3_status()SQLITE_STATUS_PAGECACHE_OVERFLOWSQLITE_STATUS_PAGECACHE_SIZE 統計資訊的收集。設定此選項已被證明可以提高高併發多執行緒應用程式的效能。

9. 省略功能的選項

以下選項可用於通過省略未使用的功能來減小編譯程式庫的大小。這可能只在空間特別緊湊的嵌入式系統中有用,因為即使包含所有功能,SQLite 程式庫也相對較小。別忘了告訴您的編譯器針對二進位大小進行優化!(如果使用 GCC,則使用 -Os 選項)。告訴您的編譯器針對大小進行優化通常比使用這些編譯時選項對程式庫大小的影響更大。您還應該驗證除錯選項是否已停用。

本節中的巨集不需要值。以下編譯開關都具有相同的效果
-DSQLITE_OMIT_ALTERTABLE
-DSQLITE_OMIT_ALTERTABLE=1
-DSQLITE_OMIT_ALTERTABLE=0

如果定義了這些選項中的任何一個,則在使用 Lemon 語法分析器產生器工具產生 parse.c 檔案以及編譯產生 keywordhash.h 檔案的 'mkkeywordhash' 工具時,也必須定義相同的 SQLITE_OMIT_* 選項集。因此,這些選項只能在從標準原始碼建構程式庫時使用,而不能從合併檔案使用。某些 SQLITE_OMIT_* 選項在與合併檔案使用時可能會正常工作,或看起來正常工作。但這並不能保證。一般來說,請始終從標準原始碼編譯,以便利用 SQLITE_OMIT_* 選項。

重要注意事項:SQLITE_OMIT_* 選項可能無法與合併檔案一起使用。SQLITE_OMIT_* 編譯時選項通常只有在從標準原始碼檔案建構 SQLite 時才能正常工作。

可以產生可以使用預定 SQLITE_OMIT_* 選項集的 SQLite 合併檔案的特殊版本。要這樣做,請複製標準原始碼發行版中的 Makefile.linux-gcc makefile 範本。將副本的名稱更改為簡單的 "Makefile"。然後編輯 "Makefile" 以設定適當的編譯時選項。然後輸入

make clean; make sqlite3.c

產生的 "sqlite3.c" 合併程式碼檔案(及其相關的標頭檔 "sqlite3.h")然後可以移動到非 Unix 平台,使用原生編譯器進行最終編譯。

SQLITE_OMIT_* 選項不受支援。我們的意是說,在當前版本中從建構中省略程式碼的 SQLITE_OMIT_* 選項在下一版本中可能會變成無效操作。反之亦然:在當前版本中無效的 SQLITE_OMIT_* 選項可能會導致在下一版本中排除程式碼。此外,並非所有 SQLITE_OMIT_* 選項都經過測試。某些 SQLITE_OMIT_* 選項可能會導致 SQLite 故障和/或提供錯誤的答案。

重要注意事項:SQLITE_OMIT_* 編譯時選項大多不受支援。

以下是可用的 OMIT 選項:

SQLITE_OMIT_ALTERTABLE

當定義此選項時,ALTER TABLE 命令將不會包含在程式庫中。執行 ALTER TABLE 陳述式會導致剖析錯誤。

SQLITE_OMIT_ANALYZE

當定義此選項時,ANALYZE 命令將從建置中省略。

SQLITE_OMIT_ATTACH

當定義此選項時,ATTACHDETACH 命令將從建置中省略。

SQLITE_OMIT_AUTHORIZATION

定義此選項會從程式庫中省略授權回呼功能。sqlite3_set_authorizer() API 函式將不會存在於程式庫中。

SQLITE_OMIT_AUTOINCREMENT

此選項會省略 AUTOINCREMENT 功能。當定義此巨集時,宣告為「INTEGER PRIMARY KEY AUTOINCREMENT」的欄位在插入 NULL 值時的行為會與宣告為「INTEGER PRIMARY KEY」的欄位相同。 sqlite_sequence 系統表格不會被建立,即使它已經存在也不會被參考。

SQLITE_OMIT_AUTOINIT

為了向後相容缺少 sqlite3_initialize() 介面的舊版 SQLite,在進入某些關鍵介面(例如 sqlite3_open()sqlite3_vfs_register()sqlite3_mprintf())時,會自動呼叫 sqlite3_initialize() 介面。 可以透過使用 SQLITE_OMIT_AUTOINIT C 預處理器巨集建置 SQLite 來省略以這種方式自動呼叫 sqlite3_initialize() 的額外負荷。使用 SQLITE_OMIT_AUTOINIT 建置時,SQLite 不會自動初始化自身,應用程式需要在開始使用 SQLite 程式庫之前直接呼叫 sqlite3_initialize()

SQLITE_OMIT_AUTOMATIC_INDEX

此選項用於省略自動索引功能。另請參閱:SQLITE_DEFAULT_AUTOMATIC_INDEX

SQLITE_OMIT_AUTORESET

預設情況下,sqlite3_step() 介面會在必要時自動呼叫 sqlite3_reset() 來重置已準備的陳述式。此編譯時期選項會更改該行為,以便在再次呼叫 sqlite3_step() 且前次呼叫返回 SQLITE_ROWSQLITE_BUSYSQLITE_LOCKED 以外的結果時,除非中間有呼叫 sqlite3_reset(),否則將返回 SQLITE_MISUSE

在 SQLite 3.6.23.1 版(2010-03-26)及更早版本中,如果在返回 SQLITE_ROW 以外的任何內容後再次呼叫 sqlite3_step() 且中間沒有呼叫 sqlite3_reset(),則 sqlite3_step() 會一律返回 SQLITE_MISUSE。這在一些編寫不良的智慧型手機應用程式中造成問題,這些應用程式無法正確處理 SQLITE_LOCKEDSQLITE_BUSY 錯誤返回。與其修復許多有缺陷的智慧型手機應用程式,不如在 3.6.23.2 中更改 SQLite 的行為以自動重置已準備的陳述式。但這種更改在其他實作不正確的應用程式中造成問題,這些應用程式實際上是在尋找 SQLITE_MISUSE 返回以終止其查詢迴圈。(每當應用程式從 SQLite 收到 SQLITE_MISUSE 錯誤碼時,都表示該應用程式正在濫用 SQLite 介面,因此實作不正確。)SQLITE_OMIT_AUTORESET 介面已新增至 SQLite 3.7.5 版(2011-02-01),以使所有(損壞的)應用程式都能再次正常運作,而無需實際修復應用程式。

SQLITE_OMIT_AUTOVACUUM

如果定義了此選項,則程式庫將無法建立或寫入支援 自動真空 (auto_vacuum) 的資料庫。執行 PRAGMA auto_vacuum 陳述式並不會產生錯誤(因為未知的 PRAGMA 會被靜默忽略),但不會傳回值或修改資料庫檔案中的自動真空旗標。如果已編譯此選項的程式庫開啟了支援自動真空的資料庫,則該資料庫會自動以唯讀模式開啟。

SQLITE_OMIT_BETWEEN_OPTIMIZATION

此選項會停用使用 BETWEEN 運算子的 WHERE 子句的索引。

SQLITE_OMIT_BLOB_LITERAL

定義此選項後,就無法使用 X'ABCD' 語法在 SQL 陳述式中指定二進位大型物件 (BLOB)。

SQLITE_OMIT_BTREECOUNT

此選項已不再使用。它是一個無運算的選項。

SQLITE_OMIT_BUILTIN_TEST

此編譯時期選項已重新命名為 SQLITE_UNTESTABLE

SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA

此編譯時期選項會停用 PRAGMA case_sensitive_like 命令。

SQLITE_OMIT_CAST

此選項會導致 SQLite 略過 CAST 運算子的支援。

SQLITE_OMIT_CHECK

此選項會導致 SQLite 略過 CHECK 條件約束的支援。剖析器仍會接受 SQL 陳述式中的 CHECK 條件約束,只是不會強制執行它們。

SQLITE_OMIT_COMPILEOPTION_DIAGS

此選項用於略過 SQLite 中可用的編譯時期選項診斷,包括 sqlite3_compileoption_used()sqlite3_compileoption_get() C/C++ 函式、sqlite_compileoption_used()sqlite_compileoption_get() SQL 函式,以及 compile_options pragma

SQLITE_OMIT_COMPLETE

此選項會導致略過 sqlite3_complete()sqlite3_complete16() 介面。

SQLITE_OMIT_COMPOUND_SELECT

此選項用於略過複合 SELECT 功能。使用 UNION、UNION ALL、INTERSECT 或 EXCEPT 複合 SELECT 運算子的 SELECT 陳述式將會導致剖析錯誤。

VALUES 子句中有多個值的 INSERT 陳述式在內部會作為複合 SELECT 來實作。因此,此選項也會停用使用 INSERT INTO ... VALUES ... 陳述式插入多個資料列的功能。

SQLITE_OMIT_CTE

此選項會導致略過對 通用表表達式 的支援。

SQLITE_OMIT_DATETIME_FUNCS

如果定義了此選項,則會略過 SQLite 的內建日期和時間操作函式。具體來說,SQL 函式 julianday()、date()、time()、datetime() 和 strftime() 將無法使用。預設欄位值 CURRENT_TIME、CURRENT_DATE 和 CURRENT_TIMESTAMP 仍然可用。

SQLITE_OMIT_DECLTYPE

此選項會導致 SQLite 略過對 sqlite3_column_decltype()sqlite3_column_decltype16() 介面的支援。

SQLITE_OMIT_DEPRECATED

此選項會導致 SQLite 略過對標記為已棄用的介面的支援。這包括 sqlite3_aggregate_count()sqlite3_expired()sqlite3_transfer_bindings()sqlite3_global_recover()sqlite3_thread_cleanup()sqlite3_memory_alarm() 介面,以及 PRAGMA 陳述式 PRAGMA count_changesPRAGMA data_store_directoryPRAGMA default_cache_sizePRAGMA empty_result_callbacksPRAGMA full_column_namesPRAGMA short_column_namesPRAGMA temp_store_directory

SQLITE_OMIT_DESERIALIZE

此選項會導致從建置中略過 sqlite3_serialize()sqlite3_deserialize() 介面。

SQLITE_OMIT_DISKIO

這個選項會省略所有對磁碟寫入的支援,並強制資料庫僅存在記憶體中。這個選項尚未維護,可能無法與較新版本的 SQLite 搭配使用。

SQLITE_OMIT_EXPLAIN

定義此選項會導致程式庫省略 EXPLAIN 指令。嘗試執行 EXPLAIN 陳述式將會造成剖析錯誤。

SQLITE_OMIT_FLAG_PRAGMAS

這個選項會省略對查詢和設定布林屬性的 PRAGMA 指令子集的支援。

SQLITE_OMIT_FLOATING_POINT

此選項用於從 SQLite 程式庫中省略浮點數支援。指定此選項後,將浮點數指定為字面值(例如「1.01」)將會導致剖析錯誤。

未來,此選項也可能會停用其他浮點功能,例如 sqlite3_result_double()sqlite3_bind_double()sqlite3_value_double()sqlite3_column_double() API 函式。

SQLITE_OMIT_FOREIGN_KEY

如果定義此選項,則 外鍵約束 語法將不被辨識。

SQLITE_OMIT_GENERATED_COLUMNS

如果定義此選項,則 衍生欄位 語法將不被辨識。

SQLITE_OMIT_GET_TABLE

此選項會導致省略對 sqlite3_get_table()sqlite3_free_table() 的支援。

SQLITE_OMIT_HEX_INTEGER

此選項會省略對 十六進位整數字面值 的支援。

SQLITE_OMIT_INCRBLOB

此選項會導致省略對 增量式 BLOB I/O 的支援。

SQLITE_OMIT_INTEGRITY_CHECK

此選項會省略對 integrity_check pragma 的支援。

SQLITE_OMIT_INTROSPECTION_PRAGMAS

此選項會省略對 PRAGMA function_listPRAGMA module_listPRAGMA pragma_list 的支援。

SQLITE_OMIT_JSON

此選項會從建置中省略 JSON SQL 函式

SQLITE_OMIT_LIKE_OPTIMIZATION

此選項會停用 SQLite 使用索引來協助解析 WHERE 子句中的 LIKEGLOB 運算子的能力。

SQLITE_OMIT_LOAD_EXTENSION

此選項會從 SQLite 中省略整個擴充載入機制,包括 sqlite3_enable_load_extension()sqlite3_load_extension() 介面。

SQLITE_OMIT_LOCALTIME

此選項會從日期和時間函式中省略「localtime」修飾詞。當嘗試在不支援本地時間概念的平台上編譯日期和時間函式時,此選項有時很有用。

SQLITE_OMIT_LOOKASIDE

此選項會省略 旁路記憶體配置器

SQLITE_OMIT_MEMORYDB

定義此選項時,程式庫不會遵守特殊資料庫名稱「:memory:」(通常用於建立 記憶體資料庫)。如果將「:memory:」傳遞給 sqlite3_open()sqlite3_open16()sqlite3_open_v2(),則會開啟或建立具有此名稱的檔案。

SQLITE_OMIT_OR_OPTIMIZATION

此選項會停用 SQLite 將索引與 WHERE 子句中以 OR 運算子連接的詞彙一起使用的能力。

SQLITE_OMIT_PAGER_PRAGMAS

定義此選項會從建置中省略與分頁器子系統相關的 pragma。

SQLITE_OMIT_PRAGMA

此選項用於從程式庫中省略 PRAGMA 指令。請注意,除了這個選項之外,定義省略特定 pragma 的巨集也很有用,因為它們也可能會移除其他子系統中的支援程式碼。此巨集僅移除 PRAGMA 指令。

SQLITE_OMIT_PROGRESS_CALLBACK

定義此選項可省略在長時間執行的 SQL 陳述式期間發出「進度」回呼的功能。程式庫中不存在 sqlite3_progress_handler() API 函式。

SQLITE_OMIT_QUICKBALANCE

此選項省略了一種替代的、更快的 B 樹平衡例程。使用此選項會使 SQLite 稍微變小,但會使其運行速度略慢。

SQLITE_OMIT_REINDEX

定義此選項時,程式庫中不包含 REINDEX 命令。執行 REINDEX 陳述式會導致剖析錯誤。

SQLITE_OMIT_SCHEMA_PRAGMAS

定義此選項會從建置中省略用於查詢資料庫結構描述的語法。

SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS

定義此選項會從建置中省略用於查詢和修改資料庫結構描述版本和使用者版本的語法。具體來說,會省略 schema_versionuser_version PRAGMA。

SQLITE_OMIT_SHARED_CACHE

此選項建置 SQLite 時不支援 共享快取模式sqlite3_enable_shared_cache() 以及 B 樹子系統中與共享快取管理相關的大量邏輯都會被省略。

建議大多數應用程式使用此編譯時期選項,因為它可以提高效能並減少程式庫大小。

SQLITE_OMIT_SEH

如果定義此選項,則在 Windows 建置中會停用結構化例外處理 (SEH)。SEH 是一種 Windows 特有的技術,用於攔截存取記憶體映射檔案時引發的例外。SEH 用於攔截存取 WAL 模式 處理過程中,記憶體映射的 shm 檔案 時可能發生的錯誤。如果作業系統在 SQLite 嘗試存取 shm 檔案時引發錯誤,此選項會使 SQLite 攔截並處理這些錯誤,而不是中止整個程序。

此選項僅在使用 MSVC 在 Windows 上編譯時有效。

SQLITE_OMIT_SUBQUERY

如果定義此選項,則會省略對子查詢和 IN() 運算子的支援。

SQLITE_OMIT_TCL_VARIABLE

如果定義此巨集,則會省略用於將 SQL 變數自動繫結到 TCL 變數的特殊「$」語法。

SQLITE_OMIT_TEMPDB

此選項省略對 TEMP 或 TEMPORARY 資料表的支援。

SQLITE_OMIT_TRACE

此選項省略對 sqlite3_profile()sqlite3_trace() 介面及其相關邏輯的支援。

SQLITE_OMIT_TRIGGER

定義此選項會省略對 TRIGGER 物件的支援。此時 CREATE TRIGGERDROP TRIGGER 命令皆不可用,且嘗試執行其中任何一個命令都會導致剖析錯誤。此選項還會停用 外鍵約束 的強制執行,因為實作觸發器的程式碼(此選項會省略此程式碼)也用於實作 外鍵動作

SQLITE_OMIT_TRUNCATE_OPTIMIZATION

在 SQLite 的預設建置中,如果 DELETE 陳述式沒有 WHERE 子句,且對沒有觸發器的資料表進行操作,則會進行最佳化,使 DELETE 透過刪除並重新建立資料表來執行。刪除並重新建立資料表通常比逐行刪除資料表內容要快得多。這就是「截斷最佳化」。

SQLITE_OMIT_UTF16

此巨集用於省略對 UTF16 文字編碼的支援。定義此選項後,所有傳回或接受 UTF16 編碼文字的 API 函式皆不可用。這些函式的特點是它們以 '16' 結尾,例如 sqlite3_prepare16()sqlite3_column_text16()sqlite3_bind_text16()

SQLITE_OMIT_VACUUM

定義此選項時,程式庫中不包含 VACUUM 命令。執行 VACUUM 陳述式會導致剖析錯誤。

SQLITE_OMIT_VIEW

定義此選項會移除對 VIEW 物件的支援。在此情況下,CREATE VIEWDROP VIEW 命令皆無法使用,嘗試執行其中任何一個都會導致解析錯誤。

警告:如果定義了這個巨集,將無法開啟綱要中包含 VIEW 物件的資料庫。

SQLITE_OMIT_VIRTUALTABLE

此選項會移除 SQLite 中對 虛擬表格 機制的支援。

SQLITE_OMIT_WAL

此選項會移除「預寫式日誌」(又稱為「WAL」)功能。

SQLITE_OMIT_WINDOWFUNC

此選項會從建置中移除 視窗函數

SQLITE_OMIT_WSD

此選項會建置不包含可寫入靜態資料 (WSD) 的 SQLite 函式庫版本。WSD 是全域變數和/或靜態變數。某些平台不支援 WSD,因此必須使用此選項才能讓 SQLite 在這些平台上運作。

與其他縮小 SQLite 函式庫大小的 OMIT 選項不同,此選項實際上會增加 SQLite 的大小,並使其執行速度略慢。僅在為不支援 WSD 的嵌入式目標建置 SQLite 時才使用此選項。

SQLITE_OMIT_XFER_OPT

此選項會移除對有助於加快「INSERT INTO ... SELECT ...」形式語句執行速度的最佳化的支援。

SQLITE_UNTESTABLE

標準的 SQLite 建置包含與 sqlite3_test_control() 相關聯的少量邏輯,用於測試 SQLite 核心難以驗證的部分。此編譯時期選項會移除額外的測試邏輯。在 SQLite 3.16.0 版(2017 年 1 月 2 日)之前,此編譯時期選項稱為「SQLITE_OMIT_BUILTIN_TEST」。名稱已更改為更能描述使用它的含義。

設定此編譯時期選項會導致 SQLite 無法完全測試。分支測試涵蓋率從 100% 下降到大約 95%。

SQLite 開發人員遵循 NASA 的「測試你所執行的,執行你所測試的」原則。如果在交付時啟用此選項,但在測試時停用,則會違反此原則。但如果在測試期間啟用此選項,則並非所有分支都能觸及。因此,不建議使用此編譯時期選項。

SQLITE_ZERO_MALLOC

此選項會從建置中移除 預設記憶體配置器除錯記憶體配置器,並以永遠失敗的虛擬記憶體配置器取代。由於無法配置記憶體,SQLite 將無法使用此虛擬記憶體配置器執行。但可以使用 sqlite3_config(SQLITE_CONFIG_MALLOC,...) 或 sqlite3_config(SQLITE_CONFIG_HEAP,...) 在啟動時取代此虛擬程式。因此,此編譯時期選項的最終效果是允許針對不支援 malloc()、free() 和/或 realloc() 的系統函式庫編譯和連結 SQLite。

10. 分析和除錯選項

SQLITE_DEBUG

SQLite 原始碼包含數千個 assert() 陳述式,用於驗證內部假設以及子常式的前置條件和後置條件。這些 assert() 陳述式通常是關閉的(它們不會產生程式碼),因為開啟它們會使 SQLite 的執行速度降低大約三倍。但對於測試和分析,開啟 assert() 陳述式會很有用。SQLITE_DEBUG 編譯時期選項會執行此操作。

SQLITE_DEBUG 也會啟用一些其他除錯功能,例如特殊的 PRAGMA 陳述式,這些陳述式會開啟用於對 VDBE 和程式碼產生器進行疑難排解和分析的追蹤和清單功能。

SQLITE_MEMDEBUG

SQLITE_MEMDEBUG 選項會導致在 SQLite 中使用一個檢測過的 除錯記憶體配置器 作為預設的記憶體配置器。這個檢測過的記憶體配置器會檢查動態配置記憶體的誤用情況。誤用的例子包括在釋放記憶體後使用記憶體、寫入記憶體配置範圍之外、釋放非先前從記憶體配置器取得的記憶體,或未能初始化新配置的記憶體。

11. Windows 特定選項

SQLITE_WIN32_HEAP_CREATE

這個選項強制啟用 Win32 原生記憶體配置器時,建立一個私有堆積來存放所有記憶體配置。

SQLITE_WIN32_MALLOC_VALIDATE

這個選項強制啟用 Win32 原生記憶體配置器時,如果也啟用了 assert(),則策略性地呼叫 HeapValidate() 函式。

12. 編譯器連結和呼叫約定控制

以下巨集指定某些種類 SQLite 組建的介面細節。Makefile 通常會自動處理這些巨集的設定。應用程式開發人員應該不需要擔心這些巨集。以下關於這些巨集的說明是為了完整性而包含的。

SQLITE_API

這個巨集識別 SQLite 的外部可見介面。這個巨集有時會設定為「extern」。但定義是編譯器特定的。

SQLITE_APICALL

這個巨集識別 SQLite 中接受固定數量參數的公共介面常式所使用的呼叫約定。這個巨集通常定義為空,但在 Windows 組建中,有時可以設定為「__cdecl」或「__stdcall」。「__cdecl」設定是預設值,但當 SQLite 打算編譯為 Windows 系統程式庫時,會使用「__stdcall」。

單個函式宣告應包含以下其中之一,且不超過一個:SQLITE_APICALLSQLITE_CDECLSQLITE_SYSAPI

SQLITE_CALLBACK

這個巨集指定 SQLite 中回呼指標所使用的呼叫約定。這個巨集通常定義為空,但在 Windows 組建中,有時可以設定為「__cdecl」或「__stdcall」。「__cdecl」設定是預設值,但當 SQLite 打算編譯為 Windows 系統程式庫時,會使用「__stdcall」。

SQLITE_CDECL

這個巨集指定 SQLite 中可變參數介面常式所使用的呼叫約定。這個巨集通常定義為空,但在 Windows 組建中,有時可以設定為「__cdecl」。這個巨集用於可變參數常式,因此不能設定為「__stdcall」,因為 __stdcall 呼叫約定不支援可變參數函式。

單個函式宣告應包含以下其中之一,且不超過一個:SQLITE_APICALLSQLITE_CDECLSQLITE_SYSAPI

SQLITE_EXTERN

這個巨集指定 SQLite 中公共介面變數的連結方式。通常應該允許其預設為「extern」。

SQLITE_STDCALL

這個巨集已不再使用,現已棄用。

SQLITE_SYSAPI

這個巨集識別 SQLite 組建目標平台的作業系統介面所使用的呼叫約定。這個巨集通常定義為空,但在 Windows 組建中,有時可以設定為「__stdcall」。

單個函式宣告應包含以下其中之一,且不超過一個:SQLITE_APICALLSQLITE_CDECLSQLITE_SYSAPI

SQLITE_TCLAPI

這個巨集指定 TCL 程式庫介面常式所使用的呼叫約定。這個巨集不是由 SQLite 核心使用,而是由 TCL 介面TCL 測試套件 使用。這個巨集通常定義為空,但在 Windows 組建中,有時可以設定為「__cdecl」。這個巨集用於 TCL 程式庫介面常式,即使在偏好使用 __stdcall 的平台上,也始終編譯為 __cdecl,因此除非平台具有支援 __stdcall 的自訂 TCL 程式庫組建,否則不應將此巨集設定為 __stdcall。

這個巨集不能與 SQLITE_APICALLSQLITE_CALLBACKSQLITE_CDECLSQLITE_SYSAPI 等任何巨集一起使用。

本頁面最後修改時間:世界協調時間 (UTC) 2024-06-05 13:57:35