代码 SQLite 3.54.0:CLI 默认显示列名表头,单独一行 `go` 不再结束语句

2026-10-14 21:02:01

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%。

链接

复制全文 生成海报 SQLite CLI 数据库 版本更新 向后兼容

推荐文章

程序员茄子在线接单