SQLite 3.54.0:CLI 預設顯示空結果欄名
SQLite 官方 release log · 2026-10-09
SQLite 3.54.0 讓 CLI 在欄位式輸出下,即使查詢沒有任何列,也預設印出欄名標題,並把獨立工具 sqlite3_analyzer 改由 .diskused 指令取代。這個版本的 SQLITE_SOURCE_ID 是 2026-10-09 15:46:58 be8d059e…,同時移除了 Windows XP 與 Windows CE 支援。
原本的問題
過去用 CLI 跑欄位式輸出,查詢沒有結果時畫面是一片空白,看不出是語法對但沒資料,還是指令根本沒執行。要檢視資料庫佔用空間,則得另外下載 sqlite3_analyzer 這個獨立程式,版本還要和函式庫對得上。
此外,CLI 有個為了相容 SQL Server 與 Oracle 的習慣:單獨一行 go 或 / 可以結束一條 SQL。這在互動模式下容易誤觸,也讓終止符的判斷變複雜。
核心改動
release log 列出的 CLI 變更中,對日常操作影響最大的是下面三項。
- 欄名預設顯示:
.mode新增--titles always,且成為預設;要回到舊行為,用-titles on。另有--rowcount on選項。 - 可控的數字格式:
.mode新增--ifmt與--fpfmt,以 printf 風格的格式字串控制整數與浮點數的呈現。 - 提示字串:提示可含展開成狀態資訊的跳脫序列,初始值可由環境變數
SQLITE_PS1、SQLITE_PS2設定,預設提示也會遵守NO_COLOR。新增的sqlite3_incomplete()介面就是為這套提示管理而加。
# 3.53 以前:無結果時什麼都不印
sqlite> SELECT id, name FROM t WHERE 0;
sqlite>
# 3.54.0:預設印出欄名
sqlite> SELECT id, name FROM t WHERE 0;
id name
-- ----上面的範例只示意行為差異,實際版面以你的 .mode 為準。
查詢規劃與函式庫
查詢規劃器有四項調整:對有運算式索引的表做 UPDATE 時,若被索引的值沒變就不動索引;expr OR TRUE 與 expr OR FALSE 的最佳化更好;IN 右側 SELECT 的 DISTINCT 會被忽略;LIMIT 1 的 UNION 查詢更快、用更少記憶體。release log 沒有給這些項目各自的效能數字。
整體效能方面,release log 說用 valgrind 計算 speedtest1 的 CPU cycles,約快 4%,比一年前的 3.51.0 快約 7.5%,並註明實際結果隨負載、編譯選項與 CPU 而異。
函式庫層面新增:
printf()與 SQL 的format()新增%J、%j,用來輸出 JSON 字串字面值。- 日期函式新增
weekday -N形式的 modifier 與end ofmodifier。 sqlite3_limit()新增SQLITE_LIMIT_SCHEMA與SQLITE_LIMIT_TRIGGER_STEPS。sqlite3_result_str()介面,以及選用擴充diskused()SQL 函式。
影響範圍
會被破壞的情況有四種,升級前建議逐一檢查。
- 解析 CLI 輸出的腳本:沒有結果列時,原本輸出為空,現在多一行欄名。以「輸出是否為空」判斷有無資料的 shell 腳本會誤判,需加
-titles on或改用-csv。release log 說明-csv會自動停用顯示上限以維持舊相容性,但沒有明講它與欄名行為的關係,請自行實測。 - 用
go或/結尾的腳本:除非編譯時加上-DSQLITE_SHELL_LEGACY_COMMAND_TERMINATOR,否則這個結束語法已停用,需改成分號。 - 呼叫
sqlite3_analyzer的流程:該工具已棄用,請改用.diskused,它由diskused()擴充實作。 - 用
ALTER TABLE動ROWID、_ROWID_、OID這三個名稱的 migration:新增、刪除或改名都會直接報錯。
用 authorizer callback 的程式也要留意:現在 CREATE TABLE 的 DEFAULT 子句裡的 SQL 函式也會觸發 callback,發生在建表時與實際使用預設值時,但開啟資料庫讀 schema 時不會觸發。如果你的 callback 採白名單,原本沒見過的函式名稱可能被拒絕。
Windows 使用者的差異較大:新版要求 Vista 或更新版本,非遞迴 mutex 改用 Slim Reader/Writer Locks 以提升效能,UWP 與 WebUI 應用要加 -DSQLITE_UWP=1 編譯。release log 明確指出,這些變更只影響 Windows,Linux、Mac、BSD 等 unix 版本不受影響。在 unix 上,CLI 現在輸出未格式化 BLOB 時會保留零位元組;系統支援時,暫存檔改用 O_TMPFILE 建立。