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

SQLite 和 8+3 檔案名稱

SQLite 的預設組態假設底層檔案系統支援長檔名。

SQLite 沒有對資料庫檔案施加任何命名需求。SQLite 可以順利使用任何檔案副檔名的資料庫檔案,也可以完全沒有副檔名。當輔助檔案需要用於 回滾日誌寫入前記錄 或其他類型的 臨時磁碟檔案 時,輔助檔案的名稱通常會附加在資料庫檔案名稱的結尾。例如,如果原始資料庫稱為「app.db」,則 回滾日誌 會稱為「app.db-journal」,而 寫入前記錄 會稱為「app.db-wal」。這種輔助檔案命名方式在支援長檔名的系統上運作良好。但在施加 8+3 檔案名稱限制的系統上,即使原始資料庫檔案符合 8+3 格式,輔助檔案也不符合 8+3 格式。

變更檔案系統

建議的修復方式是選擇其他檔案系統。現今有許多效能高、可靠、免專利的檔案系統支援長檔名。建議嵌入式裝置盡可能使用這些其他檔案系統。這將避免相容性問題,以及因不一致使用 8+3 檔案名稱而導致 資料庫損毀 的風險。

調整 SQLite 以使用 8+3 檔案名稱

有些裝置被迫使用較舊的檔案系統,其檔案名稱限制為 8+3,以維持向下相容性,或由於其他非技術因素。在這種情況下,SQLite 可以強制使用符合 8+3 模式的輔助檔案,如下所示

  1. 使用編譯時期選項 SQLITE_ENABLE_8_3_NAMES=1SQLITE_ENABLE_8_3_NAMES=2 編譯 SQLite 函式庫。預設情況下,SQLite 未包含對 8+3 檔案名稱的支援,因為這會造成一些負擔。負擔很小,但即使如此,我們也不想對不需要 8+3 檔案名稱支援的數十億個 SQLite 應用程式造成負擔。

  2. 如果使用 SQLITE_ENABLE_8_3_NAMES=1 選項,則 SQLite 能夠使用 8+3 檔案名稱,但該功能已停用,必須在開啟或附加資料庫檔案時使用 URI 檔案名稱,並在 URI 中包含 "8_3_names=1" 查詢參數,才能為每個資料庫連線分別啟用該功能。如果使用 SQLITE_ENABLE_8_3_NAMES=2 編譯 SQLite,則預設啟用 8+3 檔案名稱,且可以略過此步驟。

  3. 請確定資料庫檔案名稱遵循 8+3 檔案名稱格式,且其名稱或副檔名不為空。換句話說,資料庫檔案名稱的基本名稱必須包含 1 至 8 個字元,副檔名必須包含 1 至 3 個字元。不允許空白副檔名。

在使用上述步驟時,SQLite 將僅使用副檔名的最後 3 個字元來縮短檔案名稱副檔名。因此,例如,通常稱為 "app.db-journal" 的檔案將縮短為 "app.nal"。類似地,"app.db-wal" 將變成 "app.wal",而 "app.db-shm" 將變成 "app.shm"。

請注意,資料庫檔名具有某種副檔名非常重要。如果沒有副檔名,SQLite 會附加到檔案的基本名稱來建立輔助檔名。因此,名為「db01」的資料庫會有名為「db01-journal」的回滾日誌檔案。由於此檔名沒有副檔名可縮短為 3 個字元,因此會原樣使用,並會違反 8+3 命名規則。

資料庫損毀警告

如果資料庫檔案使用 8+3 命名而不是預設長檔名存取,則每次開啟時都必須持續使用 8+3 命名由每個資料庫連線存取,否則資料庫有損毀的風險。輔助回滾日誌預寫式記錄檔案對於 SQLite 從崩潰中復原至關重要。如果應用程式使用 8+3 名稱並崩潰,則從崩潰中安全復原所需資訊會儲存在具有「.nal」或「.wal」副檔名的檔案中。如果下一個開啟資料庫的應用程式未指定「8_3_names=1」URI 參數,SQLite 會使用長檔名來嘗試找出回滾日誌或預寫式記錄檔案。它找不到這些檔案,因為它們是由崩潰的應用程式使用 8+3 名稱儲存的,因此資料庫無法正確復原,而且可能會損毀。

在某些情況下使用具有 8+3 檔名的資料庫檔案,而在其他情況下使用長檔名等於刪除熱日誌

此頁面最後修改於 2022-01-08 05:02:57 UTC