小巧、快速、可靠。
三者擇其三。

SQLite C 介面

資料庫連線設定選項

#define SQLITE_DBCONFIG_MAINDBNAME            1000 /* const char* */
#define SQLITE_DBCONFIG_LOOKASIDE             1001 /* void* int int */
#define SQLITE_DBCONFIG_ENABLE_FKEY           1002 /* int int* */
#define SQLITE_DBCONFIG_ENABLE_TRIGGER        1003 /* int int* */
#define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004 /* int int* */
#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */
#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      1006 /* int int* */
#define SQLITE_DBCONFIG_ENABLE_QPSG           1007 /* int int* */
#define SQLITE_DBCONFIG_TRIGGER_EQP           1008 /* int int* */
#define SQLITE_DBCONFIG_RESET_DATABASE        1009 /* int int* */
#define SQLITE_DBCONFIG_DEFENSIVE             1010 /* int int* */
#define SQLITE_DBCONFIG_WRITABLE_SCHEMA       1011 /* int int* */
#define SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    1012 /* int int* */
#define SQLITE_DBCONFIG_DQS_DML               1013 /* int int* */
#define SQLITE_DBCONFIG_DQS_DDL               1014 /* int int* */
#define SQLITE_DBCONFIG_ENABLE_VIEW           1015 /* int int* */
#define SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    1016 /* int int* */
#define SQLITE_DBCONFIG_TRUSTED_SCHEMA        1017 /* int int* */
#define SQLITE_DBCONFIG_STMT_SCANSTATUS       1018 /* int int* */
#define SQLITE_DBCONFIG_REVERSE_SCANORDER     1019 /* int int* */
#define SQLITE_DBCONFIG_MAX                   1019 /* Largest DBCONFIG */

這些常數是可用的整數設定選項,可以作為第二個參數傳遞給 sqlite3_db_config() 介面。

在未來的 SQLite 版本中可能會新增設定選項。現有的設定選項可能會被停止使用。應用程式應檢查 sqlite3_db_config() 的回傳程式碼,以確保呼叫成功。如果呼叫了已停止使用或不支援的設定選項,sqlite3_db_config() 介面將會返回非零的 錯誤程式碼

SQLITE_DBCONFIG_LOOKASIDE
此選項接受三個額外的參數,這些參數決定 旁路記憶體配置器 (lookaside memory allocator)資料庫連線 設定。第一個參數(sqlite3_db_config() 的第三個參數)是指向用於旁路記憶體的記憶體緩衝區的指標。SQLITE_DBCONFIG_LOOKASIDE 指令後的第一個參數可以是 NULL,在這種情況下,SQLite 將使用 sqlite3_malloc() 自行配置旁路緩衝區。第二個參數是每個旁路緩衝區槽的大小。第三個參數是槽的數量。第一個參數中緩衝區的大小必須大於或等於第二個和第三個參數的乘積。緩衝區必須對齊到 8 位元組的邊界。如果 SQLITE_DBCONFIG_LOOKASIDE 的第二個參數不是 8 的倍數,則會在內部向下捨入到下一個最小的 8 的倍數。僅當資料庫連線目前未使用旁路記憶體時,才能更改其旁路記憶體設定,換句話說,當 sqlite3_db_status(D,SQLITE_DBSTATUS_LOOKASIDE_USED,...) 返回的「目前值」為零時。任何在使用旁路記憶體時嘗試更改旁路記憶體設定的操作都會使設定保持不變,並返回 SQLITE_BUSY

SQLITE_DBCONFIG_ENABLE_FKEY
此選項用於啟用或停用 外鍵約束 (foreign key constraints) 的強制執行。應該有兩個額外的參數。第一個參數是一個整數,0 表示停用外鍵強制執行,正數表示啟用外鍵強制執行,負數表示保持外鍵強制執行設定不變。第二個參數是指向一個整數的指標,該整數將被寫入 0 或 1,以指示在此呼叫之後外鍵強制執行是關閉還是開啟。第二個參數可以是 NULL 指標,在這種情況下,不會回報外鍵強制執行設定。

SQLITE_DBCONFIG_ENABLE_TRIGGER
此選項用於啟用或停用 觸發器 (triggers)。應該有兩個額外的參數。第一個參數是一個整數,0 表示停用觸發器,正數表示啟用觸發器,負數表示保持設定不變。第二個參數是指向一個整數的指標,該整數將被寫入 0 或 1,以指示在此呼叫之後觸發器是停用還是啟用。第二個參數可以是 NULL 指標,在這種情況下,不會回報觸發器設定。

最初,此選項會停用所有觸發器。但是,自 SQLite 3.35.0 版起,即使此選項關閉,也仍然允許 TEMP 觸發器。換句話說,此選項現在僅停用主要資料庫綱要或附加資料庫綱要中的觸發器。

SQLITE_DBCONFIG_ENABLE_VIEW
這個選項用於啟用或停用檢視表 (Views)。應該提供兩個額外的參數。第一個參數是一個整數,0 表示停用檢視表,正數表示啟用檢視表,負數表示保持設定不變。第二個參數是一個指向整數的指標,用於寫入 0 或 1,表示在此呼叫後檢視表是否被停用或啟用。第二個參數可以是 NULL 指標,在這種情況下,不會回報檢視表設定。

最初,這個選項會停用所有檢視表。然而,自 SQLite 3.35.0 版本以來,即使此選項關閉,TEMP 檢視表仍然允許使用。換句話說,此選項現在僅停用主資料庫綱要或附加資料庫綱要中的檢視表。

SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
這個選項用於啟用或停用 fts3_tokenizer() 函式,它是 FTS3 全文搜尋引擎擴充功能的一部分。應該提供兩個額外的參數。第一個參數是一個整數,0 表示停用 fts3_tokenizer(),正數表示啟用 fts3_tokenizer(),負數表示保持設定不變。第二個參數是一個指向整數的指標,用於寫入 0 或 1,表示在此呼叫後 fts3_tokenizer 是否被停用或啟用。第二個參數可以是 NULL 指標,在這種情況下,不會回報新的設定。

SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
這個選項用於獨立於 load_extension() SQL 函式來啟用或停用 sqlite3_load_extension() 介面。sqlite3_enable_load_extension() API 會同時啟用或停用 C-API sqlite3_load_extension() 和 SQL 函式 load_extension()。應該提供兩個額外的參數。當這個介面的第一個參數為 1 時,則僅啟用 C-API,SQL 函式保持停用狀態。如果這個介面的第一個參數為 0,則 C-API 和 SQL 函式都會被停用。如果第一個參數為 -1,則 C-API 或 SQL 函式的狀態都不會改變。第二個參數是一個指向整數的指標,用於寫入 0 或 1,表示在此呼叫後 sqlite3_load_extension() 介面是否被停用或啟用。第二個參數可以是 NULL 指標,在這種情況下,不會回報新的設定。

SQLITE_DBCONFIG_MAINDBNAME
這個選項用於更改「main」資料庫綱要的名稱。唯一的參數是一個指向常數 UTF8 字串的指標,該字串將取代「main」成為新的綱要名稱。SQLite 不會複製新的主綱要名稱字串,因此應用程式必須確保傳遞到此 DBCONFIG 選項的參數在資料庫連線關閉之前保持不變。

SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
通常,當 wal 模式下的資料庫關閉或從資料庫控制代碼中分離時,SQLite 會檢查這是否意味著資料庫不再有任何連線。如果是,它會在關閉連線之前執行檢查點操作。這個選項可以用於覆蓋此行為。傳遞給此操作的第一個參數是一個整數 - 正數表示停用關閉時的檢查點,零(預設值)表示啟用它們,負數表示保持設定不變。第二個參數是一個指向整數的指標,用於寫入 0 或 1,表示關閉時的檢查點是否已被停用 - 0 表示未停用,1 表示已停用。

SQLITE_DBCONFIG_ENABLE_QPSG
SQLITE_DBCONFIG_ENABLE_QPSG 選項可以啟用或停用查詢規劃器穩定性保證 (QPSG)。當 QPSG 啟用時,單個 SQL 查詢語句將始終使用相同的演算法,無論繫結參數的值為何。QPSG 會停用一些查看繫結參數值的查詢優化,這可能會使某些查詢變慢。但 QPSG 的優點是行為更可預測。啟用 QPSG 後,SQLite 將始終使用與實驗室測試期間相同的查詢計劃。此設定的第一個參數是一個整數,0 表示停用 QPSG,正數表示啟用 QPSG,負數表示保持設定不變。第二個參數是一個指向整數的指標,其中會寫入 0 或 1 以指示在此呼叫之後 QPSG 是停用還是啟用。

SQLITE_DBCONFIG_TRIGGER_EQP
預設情況下,EXPLAIN QUERY PLAN 命令的輸出不包含觸發程序執行的任何操作的輸出。此選項用於設定或清除(預設值)控制此行為的旗標。傳遞給此操作的第一個參數是一個整數 - 正數表示啟用觸發程序的輸出,零表示停用它,負數表示保持設定不變。第二個參數是一個指向整數的指標,其中會寫入 0 或 1 以指示是否已停用觸發程序輸出 - 0 表示未停用,1 表示已停用。

SQLITE_DBCONFIG_RESET_DATABASE
設定 SQLITE_DBCONFIG_RESET_DATABASE 旗標,然後執行 VACUUM 以將資料庫重置為沒有結構描述和內容的空資料庫。以下程序即使對於嚴重損壞的資料庫檔案也有效。
  1. 如果資料庫連線是新開啟的,請確保它已讀取資料庫結構描述,方法是準備然後捨棄對資料庫的一些查詢,或呼叫 sqlite3_table_column_metadata(),忽略任何錯誤。僅當應用程式希望在重置後保持資料庫處於 WAL 模式(如果在重置前處於 WAL 模式)時,才需要此步驟。
  2. sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
  3. sqlite3_exec(db, "VACUUM", 0, 0, 0);
  4. sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
由於重置資料庫具有破壞性且不可逆,因此該程序需要使用這個不常見的 API 和多個步驟,以確保它不會意外發生。由於此功能必須能夠重置損壞的資料庫,並且關閉虛擬表格可能需要存取該損壞的儲存空間,因此程式庫必須放棄任何已安裝的虛擬表格,而不呼叫其 xDestroy() 方法。

SQLITE_DBCONFIG_DEFENSIVE
SQLITE_DBCONFIG_DEFENSIVE 選項可啟用或停用資料庫連線的「防禦」旗標。啟用防禦旗標後,將停用允許普通 SQL 故意損壞資料庫檔案的語言功能。停用的功能包括但不限於以下內容:

SQLITE_DBCONFIG_WRITABLE_SCHEMA
SQLITE_DBCONFIG_WRITABLE_SCHEMA 選項可以啟用或停用「writable_schema」旗標。這與設定 PRAGMA writable_schema=ONPRAGMA writable_schema=OFF 具有相同的效果,並且在邏輯上等效。此設定的第一個參數是一個整數,0 表示停用 writable_schema,正數表示啟用 writable_schema,負數表示保持設定不變。第二個參數是一個指向整數的指標,其中會寫入 0 或 1 以指示在此呼叫之後 writable_schema 是啟用還是停用。

SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 選項可以啟用或停用 ALTER TABLE RENAME 命令的舊版行為,使其如同 3.24.0 版 (2018-06-04) 之前的版本一樣。詳情請參閱 ALTER TABLE RENAME 文件 中的「相容性注意事項」。此功能也可以使用 PRAGMA legacy_alter_table 陳述式來開啟或關閉。

SQLITE_DBCONFIG_DQS_DML
SQLITE_DBCONFIG_DQS_DML 選項僅針對 DML 陳述式(即 DELETE、INSERT、SELECT 和 UPDATE 陳述式)啟用或停用舊版 雙引號字串字面值 的非標準特性。此設定的預設值由編譯時期選項 -DSQLITE_DQS 決定。

SQLITE_DBCONFIG_DQS_DDL
SQLITE_DBCONFIG_DQS 選項針對 DDL 陳述式(例如 CREATE TABLE 和 CREATE INDEX)啟用或停用舊版 雙引號字串字面值 的非標準特性。此設定的預設值由編譯時期選項 -DSQLITE_DQS 決定。

SQLITE_DBCONFIG_TRUSTED_SCHEMA
SQLITE_DBCONFIG_TRUSTED_SCHEMA 選項指示 SQLite 假設資料庫結構描述未受惡意內容污染。當 SQLITE_DBCONFIG_TRUSTED_SCHEMA 選項停用時,SQLite 會採取額外的防禦措施來保護應用程式免受危害,包括:為了與舊版相容,此設定預設為「開啟」,但建議所有應用程式盡可能將其關閉。此設定也可以使用 PRAGMA trusted_schema 陳述式來控制。

SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 選項可以啟用或停用舊版檔案格式旗標。啟用時,此旗標會使所有新建立的資料庫檔案的結構描述格式版本號(位於資料庫標頭偏移量 44 處的 4 位元組整數)為 1。這表示產生的資料庫檔案將可被 3.0.0 (2004-06-18) 以來的任何 SQLite 版本讀取和寫入。如果沒有此設定,新建立的資料庫通常無法被 3.3.0 (2006-01-11) 之前的 SQLite 版本理解。在撰寫本文時,幾乎不需要產生與 3.0.0 版完全相容的資料庫檔案,因此此設定的實際用途不大,但提供此設定是為了讓 SQLite 可以繼續宣稱能夠產生與 3.0.0 版相容的新資料庫檔案。

請注意,當 SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 設定開啟時,VACUUM 命令在嘗試處理具有生成的欄位和降冪索引的表格時將會失敗,並顯示不明確的錯誤。這不被視為錯誤,因為 SQLite 3.3.0 版和更早版本不支援生成的欄位或降冪索引。

SQLITE_DBCONFIG_STMT_SCANSTATUS
SQLITE_DBCONFIG_STMT_SCANSTATUS 選項僅在 SQLITE_ENABLE_STMT_SCANSTATUS 編譯版本中才有用。在這種情況下,它會設定或清除一個旗標,以啟用 sqlite3_stmt_scanstatus_v2() 統計資訊的收集。要收集統計資訊,在準備 SQL 陳述式和執行陳述式時,都必須在資料庫控制代碼上設定此旗標。預設情況下,此旗標已設定(啟用統計資訊收集)。此選項需要兩個參數:一個整數和一個指向整數的指標。第一個參數為 1、0 或 -1,分別表示啟用、停用或保持陳述式掃描狀態選項不變。如果第二個參數不是 NULL,則在處理第一個參數後,陳述式掃描狀態設定的值會寫入第二個參數指向的整數中。

SQLITE_DBCONFIG_REVERSE_SCANORDER
SQLITE_DBCONFIG_REVERSE_SCANORDER 選項會改變表格和索引掃描的預設順序,讓掃描從結尾開始往前進行,而不是從開頭往結尾進行。設定 SQLITE_DBCONFIG_REVERSE_SCANORDER 與設定 PRAGMA reverse_unordered_selects 的效果相同。這個選項接受兩個參數:一個整數和一個指向整數的指標。第一個參數可以是 1、0 或 -1,分別代表啟用、停用或維持反向掃描順序旗標的狀態。如果第二個參數不是 NULL,則會根據處理第一個參數後反向掃描順序旗標的設定狀態,將 0 或 1 寫入第二個參數指向的整數中。

另請參閱物件常數函式列表。