int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); int sqlite3_open16( const void *filename, /* Database filename (UTF-16) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); int sqlite3_open_v2( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb, /* OUT: SQLite db handle */ int flags, /* Flags */ const char *zVfs /* Name of VFS module to use */ );
這些函式會開啟以 filename 參數指定的 SQLite 資料庫檔案。 sqlite3_open() 和 sqlite3_open_v2() 將 filename 參數解譯為 UTF-8,而 sqlite3_open16() 則將其解譯為原生位元組順序的 UTF-16。即使發生錯誤,通常也會在 *ppDb 中返回資料庫連線控制代碼。唯一的例外是,如果 SQLite 無法配置記憶體來存放 sqlite3 物件,則會在 *ppDb 中寫入 NULL,而不是指向 sqlite3 物件的指標。如果資料庫成功開啟(和/或建立),則返回 SQLITE_OK。否則返回錯誤碼。在任何 sqlite3_open() 函式失敗後,可以使用 sqlite3_errmsg() 或 sqlite3_errmsg16() 函式來取得錯誤的英文描述。
使用 sqlite3_open() 或 sqlite3_open_v2() 建立的資料庫,預設編碼為 UTF-8。使用 sqlite3_open16() 建立的資料庫,預設編碼為原生位元組順序的 UTF-16。
無論開啟時是否發生錯誤,當不再需要資料庫連線控制代碼時,都應將其傳遞給 sqlite3_close() 來釋放相關資源。
sqlite3_open_v2() 介面的工作方式與 sqlite3_open() 類似,但它接受兩個額外的參數,以對新的資料庫連線進行額外的控制。 sqlite3_open_v2() 的 flags 參數至少必須包含以下三種旗標組合之一:
除了必要的旗標之外,還支援以下選用旗標:
如果 sqlite3_open_v2() 的第三個參數不是上面顯示的必要組合(可選擇與其他 SQLITE_OPEN_* 位元 組合),則行為未定義。過去版本的 SQLite 會忽略 sqlite3_open_v2() 的 flags 參數中的多餘位元,但未來的 SQLite 版本可能不會延續此行為,因此應用程式不應依賴它。尤其要注意的是,SQLITE_OPEN_EXCLUSIVE 旗標對於 sqlite3_open_v2() 來說無效。如果資料庫已存在,SQLITE_OPEN_EXCLUSIVE *不會* 導致開啟失敗。SQLITE_OPEN_EXCLUSIVE 旗標僅供 VFS 介面 使用,而不是供 sqlite3_open_v2() 使用。
sqlite3_open_v2() 的第四個參數是定義新資料庫連線應使用的作業系統介面的 sqlite3_vfs 物件的名稱。如果第四個參數是 NULL 指標,則使用預設的 sqlite3_vfs 物件。
如果檔名是 ":memory:",則會為該連線建立一個私有的、暫時的記憶體資料庫。當資料庫連線關閉時,此記憶體資料庫將消失。未來版本的 SQLite 可能會使用其他以 ":" 字元開頭的特殊檔名。建議當資料庫檔名實際上以 ":" 字元開頭時,您應該在檔名前加上路徑名稱,例如 "./",以避免歧義。
如果檔名是空字串,則會建立一個私有的、暫時的磁碟資料庫。此私有資料庫將在資料庫連線關閉後自動刪除。
如果啟用了URI 檔名的解析,並且檔名參數以 "file:" 開頭,則檔名會被解釋為 URI。如果在 sqlite3_open_v2() 的第三個參數中設定了 SQLITE_OPEN_URI 旗標,或者使用 SQLITE_CONFIG_URI 選項和 sqlite3_config() 方法或通過 SQLITE_USE_URI 編譯時選項全域啟用了它,則會啟用 URI 檔名解析。URI 檔名解析預設為關閉,但未來版本的 SQLite 可能會預設啟用 URI 檔名解析。有關更多資訊,請參閱「URI 檔名」。
URI 檔名會根據 RFC 3986 進行解析。如果 URI 包含授權機構,則它必須是空字串或字串 "localhost"。如果授權機構不是空字串或 "localhost",則會向呼叫者返回錯誤。URI 的片段組件(如果存在)將被忽略。
SQLite 使用 URI 的路徑組件作為包含資料庫的磁碟檔案的名稱。如果路徑以 '/' 字元開頭,則它會被解釋為絕對路徑。如果路徑不是以 '/' 開頭(表示 URI 中省略了授權機構部分),則該路徑會被解釋為相對路徑。在 Windows 上,絕對路徑的第一個組件是磁碟機規格(例如 "C:")。
URI 的查詢組件可能包含由 SQLite 本身或自定義 VFS 實作解讀的參數。SQLite 及其內建的VFS會解讀下列查詢參數:
在 URI 的查詢組件中指定未知參數不是錯誤。未來版本的 SQLite 可能會理解其他查詢參數。有關其他資訊,請參閱「對 SQLite 具有特殊含義的查詢參數」。
URI 檔名 | 結果 |
---|---|
file:data.db | 開啟目前目錄中的檔案「data.db」。 |
file:/home/fred/data.db file:///home/fred/data.db file://127.0.0.1/home/fred/data.db | 開啟資料庫檔案「/home/fred/data.db」。 |
file://darkstar/home/fred/data.db | 錯誤。「darkstar」不是已辨識的授權單位。 |
file:///C:/Documents%20and%20Settings/fred/Desktop/data.db | 僅限 Windows:開啟 C 槽上 fred 桌面上的檔案「data.db」。請注意,此範例中的 %20 跳脫字元並非絕對必要 — 空格字元可以在 URI 檔名中直接使用。 |
file:data.db?mode=ro&cache=private | 以唯讀模式開啟目前目錄下的 "data.db" 檔案。無論預設是否啟用共享快取模式,皆使用私有快取。 |
file:/home/fred/data.db?vfs=unix-dotfile | 開啟檔案 "/home/fred/data.db"。使用特殊的 VFS "unix-dotfile",它使用點文件 (dot-files) 來取代 POSIX 諮詢式鎖定 (advisory locking)。 |
file:data.db?mode=readonly | 錯誤。"readonly" 不是 "mode" 參數的有效選項。請改用 "ro":"file:data.db?mode=ro"。 |
URI 十六進位逸出序列 (%HH) 在 URI 的路徑和查詢組成部分中受到支援。十六進位逸出序列由一個百分比符號 - "%" - 後面接兩個十六進位數字組成,用於指定一個八位元組值。在解譯 URI 檔案名的路徑或查詢組成部分之前,會先使用 UTF-8 編碼,並將所有十六進位逸出序列替換為包含對應八位元組值的單個位元組。如果此過程產生無效的 UTF-8 編碼,結果未定義。
Windows 使用者注意事項:sqlite3_open() 和 sqlite3_open_v2() 的檔案名稱參數使用的編碼必須是 UTF-8,而不是目前定義的任何字碼頁。包含國際字元的檔案名稱必須在傳遞給 sqlite3_open() 或 sqlite3_open_v2() 之前轉換為 UTF-8。
Windows 執行階段使用者注意事項:必須在呼叫 sqlite3_open() 或 sqlite3_open_v2() 之前設定暫存目錄。否則,需要使用暫存檔案的各種功能可能會失敗。