SQLite 3.54.0:CLI 默认显示列名表头,单独一行 go 不再结束语句
SQLite 3.54.0 于 2026-10-09 发布(来源 sqlite.org 官方 change log 与 news)。下面按平台、CLI、SQL 与查询计划器三块记录改动,会打断旧脚本的地方单独标出。
Windows:最低版本抬到 Vista 之后
从本版起,SQLite 不再在 Windows Vista(约 2007 年)之前的 Windows 版本上编译。原因是互斥锁实现从 CriticalSection 换成 Slim Reader/Writer Locks(SRWLs)——SRWL 更快,但 Windows XP 及更早版本不提供。这项限制只影响 Windows,Linux/macOS/BSD 等其他 unix 变体不受影响。UWP 与 WebUI 应用编译时需加:
-DSQLITE_UWP=1
CLI:两个会打断旧脚本的改动
列名表头默认显示
列式输出模式下,即使查询返回 0 行,CLI 现在默认也显示列名表头。新版默认行为等价于 --titles always,要恢复旧行为:
sqlite3 -titles on mydb.sqlite
单独一行 go 或 / 不再结束语句
原本为兼容 SQL Server / Oracle 而保留的能力被取消:用仅含 go 或 / 的行来结束 SQL 命令,现在不再生效,除非编译时加上:
-DSQLITE_SHELL_LEGACY_COMMAND_TERMINATOR
依赖这种写法的旧脚本会直接报错。
提示符、点命令与格式化
- CLI 提示符字符串可含转义序列以显示状态信息;初始提示符会用环境变量
SQLITE_PS1与SQLITE_PS2初始化(如存在)。默认提示符遵循NO_COLOR环境变量。 .diskused点命令改用新的diskused()扩展实现,取代独立的sqlite3_analyzer工具,后者已弃用——这是最后一个包含sqlite3_analyzer的版本。.mode新增--rowcount on与--titles always;新增--ifmt与--fpfmt选项,用 printf 风格格式串精确控制整数与浮点渲染。- 在 unix 上,CLI 输出未格式化的 BLOB 值时会保留零字节。
-csv命令行选项自动关闭显示上限(display limits),以保持旧兼容性。
SQL 与查询计划器
ALTER TABLE尝试新增/删除/重命名名为ROWID、_ROWID_或OID的特殊列时,直接报错。UPDATE带表达式索引的表时,若被索引的值未变,不再改动表达式索引。- 优化
expr OR TRUE与expr OR FALSE;忽略IN运算符右侧 SELECT 的DISTINCT;LIMIT恰为 1 的 UNION 查询更快、内存更省。 - 新增可选扩展函数
diskused()。 - 内置
printf()与format()新增%J与%j转换,用于渲染 JSON 字符串字面量。 - 日期/时间函数新增
weekday -N形式的 weekday 修饰符,以及end of修饰符。 - 支持
O_TMPFILE的系统上生成临时文件时使用O_TMPFILE。 - 授权回调(authorizer callback)现在也会对
CREATE TABLE的DEFAULT子句里出现的 SQL 函数被调用:CREATE TABLE首次执行时与 DEFAULT 值真正被使用时各一次;打开数据库读 schema 时不调用。 sqlite3_limit()新增SQLITE_LIMIT_SCHEMA与SQLITE_LIMIT_TRIGGER_STEPS。- 新增 C 接口
sqlite3_result_str()、sqlite3_incomplete()。
性能
用 valgrind 在 Linux x64 上跑 speedtest1 计数 CPU 周期,约快 4%;与一年前的 3.51.0 相比约快 7.5%。