小巧、快速、可靠。
選擇其中三項。

SQLite C 介面

組態選項

#define SQLITE_CONFIG_SINGLETHREAD         1  /* nil */
#define SQLITE_CONFIG_MULTITHREAD          2  /* nil */
#define SQLITE_CONFIG_SERIALIZED           3  /* nil */
#define SQLITE_CONFIG_MALLOC               4  /* sqlite3_mem_methods* */
#define SQLITE_CONFIG_GETMALLOC            5  /* sqlite3_mem_methods* */
#define SQLITE_CONFIG_SCRATCH              6  /* No longer used */
#define SQLITE_CONFIG_PAGECACHE            7  /* void*, int sz, int N */
#define SQLITE_CONFIG_HEAP                 8  /* void*, int nByte, int min */
#define SQLITE_CONFIG_MEMSTATUS            9  /* boolean */
#define SQLITE_CONFIG_MUTEX               10  /* sqlite3_mutex_methods* */
#define SQLITE_CONFIG_GETMUTEX            11  /* sqlite3_mutex_methods* */
/* previously SQLITE_CONFIG_CHUNKALLOC    12 which is now unused. */
#define SQLITE_CONFIG_LOOKASIDE           13  /* int int */
#define SQLITE_CONFIG_PCACHE              14  /* no-op */
#define SQLITE_CONFIG_GETPCACHE           15  /* no-op */
#define SQLITE_CONFIG_LOG                 16  /* xFunc, void* */
#define SQLITE_CONFIG_URI                 17  /* int */
#define SQLITE_CONFIG_PCACHE2             18  /* sqlite3_pcache_methods2* */
#define SQLITE_CONFIG_GETPCACHE2          19  /* sqlite3_pcache_methods2* */
#define SQLITE_CONFIG_COVERING_INDEX_SCAN 20  /* int */
#define SQLITE_CONFIG_SQLLOG              21  /* xSqllog, void* */
#define SQLITE_CONFIG_MMAP_SIZE           22  /* sqlite3_int64, sqlite3_int64 */
#define SQLITE_CONFIG_WIN32_HEAPSIZE      23  /* int nByte */
#define SQLITE_CONFIG_PCACHE_HDRSZ        24  /* int *psz */
#define SQLITE_CONFIG_PMASZ               25  /* unsigned int szPma */
#define SQLITE_CONFIG_STMTJRNL_SPILL      26  /* int nByte */
#define SQLITE_CONFIG_SMALL_MALLOC        27  /* boolean */
#define SQLITE_CONFIG_SORTERREF_SIZE      28  /* int nByte */
#define SQLITE_CONFIG_MEMDB_MAXSIZE       29  /* sqlite3_int64 */
#define SQLITE_CONFIG_ROWID_IN_VIEW       30  /* int* */

這些常數是可以作為 sqlite3_config() 介面第一個參數傳入的可用整數組態選項。

大多數 sqlite3_config() 的組態選項只有在呼叫 sqlite3_initialize() 之前或 sqlite3_shutdown() 之後才會生效。少數例外稱為「隨時可用的組態選項」。在呼叫 sqlite3_initialize()sqlite3_shutdown() 之間,以非隨時可用組態選項作為第一個參數呼叫 sqlite3_config() 將會無效,並返回 SQLITE_MISUSE。

隨時可用的組態選項集合可能會在 SQLite 的不同版本之間發生變化(透過新增和/或刪除)。截至 SQLite 3.42.0 版,完整的隨時可用組態選項集合如下:

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

SQLITE_CONFIG_SINGLETHREAD
此選項沒有參數。此選項將 執行緒模式 設定為單執行緒。換句話說,它會停用所有互斥鎖,並將 SQLite 置於只能由單個執行緒使用的模式。如果 SQLite 是使用 SQLITE_THREADSAFE=0 編譯時選項編譯的,則無法更改 執行緒模式 的預設值(單執行緒),因此如果使用 SQLITE_CONFIG_SINGLETHREAD 組態選項呼叫 sqlite3_config(),它將返回 SQLITE_ERROR

SQLITE_CONFIG_MULTITHREAD
此選項沒有參數。此選項將 執行緒模式 設定為多執行緒。換句話說,它會停用 資料庫連線預編譯語句 物件上的互斥鎖。應用程式負責序列化對 資料庫連線預編譯語句 的存取。但其他互斥鎖已啟用,因此只要沒有兩個執行緒嘗試同時使用同一個 資料庫連線,SQLite 就可以安全地在多執行緒環境中使用。如果 SQLite 是使用 SQLITE_THREADSAFE=0 編譯時選項編譯的,則無法設定多執行緒 執行緒模式,並且如果使用 SQLITE_CONFIG_MULTITHREAD 組態選項呼叫 sqlite3_config(),它將返回 SQLITE_ERROR

SQLITE_CONFIG_SERIALIZED
這個選項沒有參數。此選項將執行緒模式設定為序列化 (Serialized)。換句話說,此選項會啟用所有互斥鎖,包括資料庫連線預編譯語句物件上的遞迴互斥鎖。在此模式下(當 SQLite 以SQLITE_THREADSAFE=1編譯時為預設模式),SQLite 函式庫本身會將對資料庫連線預編譯語句的存取序列化,以便應用程式可以自由地在不同執行緒中同時使用相同的資料庫連線或相同的預編譯語句。如果 SQLite 是使用SQLITE_THREADSAFE=0編譯時選項編譯的,則無法設定序列化執行緒模式,並且如果使用 SQLITE_CONFIG_SERIALIZED 設定選項呼叫sqlite3_config(),將會返回SQLITE_ERROR

SQLITE_CONFIG_MALLOC
SQLITE_CONFIG_MALLOC 選項接受一個參數,該參數是指向sqlite3_mem_methods結構體實例的指標。該參數指定要用於取代 SQLite 內建記憶體配置常式的替代低階記憶體配置常式。在sqlite3_config()呼叫返回之前,SQLite 會自行製作sqlite3_mem_methods結構體內容的私有副本。

SQLITE_CONFIG_GETMALLOC
SQLITE_CONFIG_GETMALLOC 選項接受一個參數,該參數是指向sqlite3_mem_methods結構體實例的指標。sqlite3_mem_methods結構體會填入目前定義的記憶體配置常式。此選項可用於使用模擬記憶體配置失敗或追蹤記憶體使用情況的包裝器來覆蓋預設記憶體配置常式。

SQLITE_CONFIG_SMALL_MALLOC
SQLITE_CONFIG_SMALL_MALLOC 選項接受一個 int 類型的參數,解讀為布林值,如果為 true,則向 SQLite 提供一個提示,指示其應盡可能避免大型記憶體配置。如果 SQLite 可以自由進行大型記憶體配置,它的運行速度會更快,但某些應用程式可能更願意以較慢的運行速度來換取避免大型配置時可能實現的記憶體碎片保證。此提示通常是關閉的。

SQLITE_CONFIG_MEMSTATUS
SQLITE_CONFIG_MEMSTATUS 選項接受一個 int 類型的參數,解讀為布林值,用於啟用或停用記憶體配置統計資訊的收集。當停用記憶體配置統計資訊時,以下 SQLite 介面將無法運作:預設情況下會啟用記憶體配置統計資訊,除非使用SQLITE_DEFAULT_MEMSTATUS=0 編譯 SQLite,在這種情況下,預設情況下會停用記憶體配置統計資訊。

SQLITE_CONFIG_SCRATCH
SQLITE_CONFIG_SCRATCH 選項已不再使用。

SQLITE_CONFIG_PAGECACHE
SQLITE_CONFIG_PAGECACHE 選項指定一個記憶體池,SQLite 可以使用它作為資料庫頁面快取,搭配預設的頁面快取實作。如果使用 SQLITE_CONFIG_PCACHE2 載入應用程式定義的頁面快取實作,則此配置選項無效。 SQLITE_CONFIG_PAGECACHE 有三個參數:指向 8 位元組對齊記憶體的指標 (pMem)、每個頁面快取行的長度 (sz) 以及快取行的數量 (N)。 sz 參數應為最大資料庫頁面的長度(512 到 65536 之間的 2 的次方)加上每個頁面標頭的一些額外位元組。頁面標頭所需的額外位元組數可以使用 SQLITE_CONFIG_PCACHE_HDRSZ 確定。除了浪費記憶體之外,sz 參數大於必要值是無害的。 pMem 參數必須是 NULL 指標或指向至少 sz*N 位元組的 8 位元組對齊記憶體區塊的指標,否則後續行為未定義。當 pMem 不為 NULL 時,SQLite 將盡力使用提供的記憶體來滿足頁面快取需求,如果頁面快取行大於 sz 位元組或所有 pMem 緩衝區都耗盡,則會退回到 sqlite3_malloc()。如果 pMem 為 NULL 且 N 不為零,則每個資料庫連線都會從 sqlite3_malloc() 進行初始批量分配頁面快取記憶體,如果 N 為正數,則分配足夠 N 個快取行的記憶體;如果 N 為負數,則分配 -1024*N 位元組的記憶體。如果初始分配提供的頁面快取記憶體不足,則 SQLite 會針對每個額外的快取行分別使用 sqlite3_malloc()

SQLITE_CONFIG_HEAP
SQLITE_CONFIG_HEAP 選項指定一個靜態記憶體緩衝區,SQLite 將使用它來滿足所有動態記憶體分配需求,除了 SQLITE_CONFIG_PAGECACHE 提供的需求之外。 SQLITE_CONFIG_HEAP 選項僅在使用 SQLITE_ENABLE_MEMSYS3SQLITE_ENABLE_MEMSYS5 編譯 SQLite 時可用,否則呼叫時會返回 SQLITE_ERROR。 SQLITE_CONFIG_HEAP 有三個參數:指向記憶體的 8 位元組對齊指標、記憶體緩衝區中的位元組數以及最小分配大小。如果第一個指標(記憶體指標)為 NULL,則 SQLite 會恢復使用其預設記憶體分配器(系統 malloc() 實作),並撤銷先前對 SQLITE_CONFIG_MALLOC 的任何呼叫。如果記憶體指標不為 NULL,則會使用替代記憶體分配器來處理所有 SQLite 的記憶體分配需求。第一個指標(記憶體指標)必須與 8 位元組邊界對齊,否則 SQLite 的後續行為將未定義。最小分配大小上限為 2**12。最小分配大小的合理值為 2**5 到 2**8。

SQLITE_CONFIG_MUTEX
SQLITE_CONFIG_MUTEX 選項接受一個參數,該參數是指向 sqlite3_mutex_methods 結構實例的指標。該參數指定替代的低階互斥鎖常式,以取代 SQLite 內建的互斥鎖常式。在呼叫 sqlite3_config() 返回之前,SQLite 會複製 sqlite3_mutex_methods 結構的內容。如果使用 SQLITE_THREADSAFE=0 編譯時選項編譯 SQLite,則會從建置中省略整個互斥鎖子系統,因此使用 SQLITE_CONFIG_MUTEX 配置選項呼叫 sqlite3_config() 將返回 SQLITE_ERROR

SQLITE_CONFIG_GETMUTEX
SQLITE_CONFIG_GETMUTEX 選項接受一個參數,該參數是指向 sqlite3_mutex_methods 結構實例的指標。 sqlite3_mutex_methods 結構會填入當前定義的互斥鎖常式。 這個選項可用於使用包裝函式覆蓋預設的互斥鎖分配常式,例如用於追蹤互斥鎖使用情況以進行效能分析或測試。 如果 SQLite 是使用 SQLITE_THREADSAFE=0 編譯時選項編譯的,則整個互斥鎖子系統會從建置中省略,因此使用 SQLITE_CONFIG_GETMUTEX 設定選項呼叫 sqlite3_config() 將會返回 SQLITE_ERROR

SQLITE_CONFIG_LOOKASIDE
SQLITE_CONFIG_LOOKASIDE 選項接受兩個參數,用於決定每個 資料庫連線 上旁視記憶體的預設大小。 第一個參數是每個旁視緩衝區槽的大小,第二個參數是分配給每個資料庫連線的槽數量。 SQLITE_CONFIG_LOOKASIDE 設定 _預設_ 旁視大小。 sqlite3_db_config()SQLITE_DBCONFIG_LOOKASIDE 選項可用於更改個別連線上的旁視設定。

SQLITE_CONFIG_PCACHE2
SQLITE_CONFIG_PCACHE2 選項接受一個參數,該參數是指向 sqlite3_pcache_methods2 物件的指標。 這個物件指定了自訂頁面快取實作的介面。 SQLite 會建立 sqlite3_pcache_methods2 物件的副本。

SQLITE_CONFIG_GETPCACHE2
SQLITE_CONFIG_GETPCACHE2 選項接受一個參數,該參數是指向 sqlite3_pcache_methods2 物件的指標。 SQLite 會將目前的頁面快取實作複製到該物件中。

SQLITE_CONFIG_LOG
SQLITE_CONFIG_LOG 選項用於設定 SQLite 全域 錯誤日誌。(SQLITE_CONFIG_LOG 選項接受兩個參數:一個指向函式的指標,其呼叫簽章為 void(*)(void*,int,const char*),以及一個指向 void 的指標。如果函式指標不是 NULL,則 sqlite3_log() 會呼叫它來處理每個記錄事件。如果函式指標是 NULL,則 sqlite3_log() 介面將變為無運作。每當呼叫應用程式定義的記錄器函式時,作為 SQLITE_CONFIG_LOG 的第二個參數的 void 指標會作為第一個參數傳遞給該函式。記錄器函式的第二個參數是對應 sqlite3_log() 呼叫的第一個參數的副本,旨在作為 結果代碼擴展結果代碼。傳遞給記錄器的第三個參數是透過 sqlite3_snprintf() 格式化後的日誌訊息。SQLite 記錄介面不可重入;應用程式提供的記錄器函式不得呼叫任何 SQLite 介面。在多執行緒應用程式中,應用程式定義的記錄器函式必須是執行緒安全的。

SQLITE_CONFIG_URI
SQLITE_CONFIG_URI 選項接受一個 int 類型的參數。如果非零,則全域啟用 URI 處理。如果參數為零,則全域停用 URI 處理。如果全域啟用 URI 處理,則傳遞給 sqlite3_open()sqlite3_open_v2()sqlite3_open16() 的所有檔案名稱或指定為 ATTACH 命令一部分的檔案名稱都將被解釋為 URI,無論開啟資料庫連線時是否設定了 SQLITE_OPEN_URI 旗標。如果全域停用,則只有在開啟資料庫連線時設定了 SQLITE_OPEN_URI 旗標的情況下,檔案名稱才會被解釋為 URI。預設情況下,URI 處理是全域停用的。可以透過定義 SQLITE_USE_URI 符號來編譯以更改預設值。

SQLITE_CONFIG_COVERING_INDEX_SCAN
SQLITE_CONFIG_COVERING_INDEX_SCAN 選項接受單一整數參數,該參數會被解讀為布林值,用於在查詢最佳化器中啟用或停用覆蓋索引以進行全表掃描。預設設定由 SQLITE_ALLOW_COVERING_INDEX_SCAN 編譯時期選項決定,如果省略該編譯時期選項,則預設為「啟用」。之所以能夠停用覆蓋索引用於全表掃描,是因為某些編碼不正確的舊版應用程式在啟用此最佳化時可能會發生故障。提供停用此最佳化的功能,讓舊版、有錯誤的應用程式程式碼即使在新版 SQLite 中也能正常運作,無需修改。

SQLITE_CONFIG_PCACHE 和 SQLITE_CONFIG_GETPCACHE
這些選項已過時,新程式碼不應使用。它們是為了向後相容性而保留,但現在已無作用。

SQLITE_CONFIG_SQLLOG
僅當使用已定義 SQLITE_ENABLE_SQLLOG 預處理器巨集編譯 sqlite 時,此選項才可用。第一個參數應為指向 void(*)(void*,sqlite3*,const char*, int) 類型函式的指標。第二個參數應為 (void*) 類型。程式庫會在三種不同的情況下呼叫回呼函式,由第四個參數的值識別。如果第四個參數為 0,則表示作為第二個參數傳遞的資料庫連線剛剛開啟。第三個參數指向包含主資料庫檔案名稱的緩衝區。如果第四個參數為 1,則表示第三個參數指向的 SQL 陳述式剛剛執行。或者,如果第四個參數為 2,則表示作為第二個參數傳遞的連線正在關閉。在這種情況下,第三個參數會傳遞 NULL。在標準 SQLite 原始碼樹中的 "test_sqllog.c" 原始碼檔案中可以看到使用此設定選項的範例。

SQLITE_CONFIG_MMAP_SIZE
SQLITE_CONFIG_MMAP_SIZE 接受兩個 64 位元整數 (sqlite3_int64) 值,分別是預設 mmap 大小限制(PRAGMA mmap_size 的預設設定)和允許的最大 mmap 大小限制。預設設定可以由每個資料庫連線使用 PRAGMA mmap_size 命令或使用 SQLITE_FCNTL_MMAP_SIZE 檔案控制來覆寫。如果需要,允許的最大 mmap 大小會被靜默截斷,使其不超過由 SQLITE_MAX_MMAP_SIZE 編譯時期選項設定的編譯時期最大 mmap 大小。如果此選項的任何一個參數為負數,則該參數會變更為其編譯時期預設值。

SQLITE_CONFIG_WIN32_HEAPSIZE
僅當使用已定義 SQLITE_WIN32_MALLOC 預處理器巨集將 SQLite 編譯為 Windows 時,SQLITE_CONFIG_WIN32_HEAPSIZE 選項才可用。SQLITE_CONFIG_WIN32_HEAPSIZE 接受一個 32 位元無符號整數值,該值指定所建立堆積的最大大小。

SQLITE_CONFIG_PCACHE_HDRSZ
SQLITE_CONFIG_PCACHE_HDRSZ 選項接受單一參數,該參數是指向整數的指標,並將 SQLITE_CONFIG_PAGECACHE 中每個頁面所需的額外位元組數寫入該整數。所需的額外空間量可能會根據編譯器、目標平台和 SQLite 版本而有所不同。

SQLITE_CONFIG_PMASZ
SQLITE_CONFIG_PMASZ 選項接受單一參數,該參數是一個無符號整數,並將多執行緒排序器的「最小 PMA 大小」設定為該整數。預設最小 PMA 大小由 SQLITE_SORTER_PMASZ 編譯時期選項設定。當啟用多執行緒排序(使用 PRAGMA threads 命令)且要排序的內容量超過頁面大小乘以 PRAGMA cache_size 設定值和此值的較小值時,會啟動新的執行緒來協助排序操作。

SQLITE_CONFIG_STMTJRNL_SPILL
SQLITE_CONFIG_STMTJRNL_SPILL 選項接受單一參數,該參數將成為 敘述日誌 溢出到磁碟的閾值。 敘述日誌 會保留在記憶體中,直到其大小(以位元組為單位)超過此閾值為止,此時它們會被寫入磁碟。或者,如果閾值為 -1,則敘述日誌將始終完全保留在記憶體中。由於許多敘述日誌永遠不會變大,因此將溢出閾值設定為 64KiB 之類的值可以大大減少支援敘述復原所需的 I/O 量。此設定的預設值由 SQLITE_STMTJRNL_SPILL 編譯時選項控制。

SQLITE_CONFIG_SORTERREF_SIZE
SQLITE_CONFIG_SORTERREF_SIZE 選項接受一個 (int) 類型的單一參數 - 排序器參考大小閾值的新值。通常,當 SQLite 使用外部排序根據 ORDER BY 子句對記錄進行排序時,呼叫方所需的所有欄位都存在於已排序的記錄中。但是,如果 SQLite 根據表格欄位的宣告類型判斷其值可能非常大 - 大於配置的排序器參考大小閾值 - 則會在每個已排序的記錄中儲存一個參考,並在記錄按排序順序返回時從資料庫載入所需的欄位值。此選項的預設值是永遠不使用此最佳化。為此選項指定負值將恢復預設行為。此選項僅在使用 SQLITE_ENABLE_SORTER_REFERENCES 編譯時選項編譯 SQLite 時才可用。

SQLITE_CONFIG_MEMDB_MAXSIZE
SQLITE_CONFIG_MEMDB_MAXSIZE 選項接受單一 sqlite3_int64 參數,該參數是使用 sqlite3_deserialize() 建立的記憶體資料庫的預設最大大小。可以使用 SQLITE_FCNTL_SIZE_LIMIT 檔案控制 來向上或向下調整個別資料庫的這個預設最大大小。如果從未使用此配置設定,則預設最大值由 SQLITE_MEMDB_DEFAULT_MAXSIZE 編譯時選項決定。如果未設定該編譯時選項,則預設最大值為 1073741824。

SQLITE_CONFIG_ROWID_IN_VIEW
SQLITE_CONFIG_ROWID_IN_VIEW 選項啟用或停用 VIEW 擁有 ROWID 的能力。只有在使用 -DSQLITE_ALLOW_ROWID_IN_VIEW 編譯 SQLite 時才能啟用此功能,在這種情況下,此功能預設為開啟。此配置選項會查詢目前的設定,或將設定變更為關閉或開啟。參數是指向整數的指標。如果該整數的初始值為 1,則會啟用 VIEW 擁有 ROWID 的能力。如果該整數的初始值為零,則會停用此能力。該整數的任何其他初始值都會使設定保持不變。在變更(如果有的話)之後,如果 VIEW 擁有 ROWID 的能力開啟或關閉,則整數會被寫入 1 或 0。如果 SQLite 是在沒有 -DSQLITE_ALLOW_ROWID_IN_VIEW 的情況下編譯的(這是通常和建議的情況),則整數始終會被填入零,無論其初始值為何。

另請參閱 物件常數函式 清單。