資料與儲存 2026 年 10 月 10 日

2026-10-10 — SQLite 3.54.0:CLI 預設顯示空結果欄名

primary=https://sqlite.org/releaselog/3_54_0.html

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 of modifier。
  • 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 建立。

原始來源:SQLite Release 3.54.0


End of article
0
Would love your thoughts, please comment.x
()
x