SQLite 3.51.0发布,新功能解读
SQLite 开发团队于 2025 年 11 月 04 日发布了 SQLite 3.51.0 版本,距离 SQLite 3.50.0 的发布间隔了五个多月,也带来不少新功能和性能优化。
按照惯例,我们来解读一下新版本的改进功能。
JSON 函数
新版本增加了两个 JSON 函数:jsonb_each() 以及 jsonb_tree()。
它们的作用与已有的 json_each() 和 json_tree() 函数相同,区别在于当返回结构中 type 字段类型为 array 或者object 时,value 字段的类型是 JSONB。例如:

CLI 接口
命令行客户端程序(sqlite3)增强了以下功能:
- .timer 指令的的精度提高到了微秒级,可以更加准确地显示 SQL 语句执行时间。
- 增强了 box 和 column 输出格式下的宽字符显示。
- .imposter 命令支持只读替代表,可以与 VACUUM 操作配合使用,而且不需要 --unsafe-testing 选项。
- 命令行选项和 .open 命令增加了一个 --ifexists 参数,只有当数据库文件存在时才会打开数据库,不会创建新的空数据库。
- .width 命令支持的最大列宽限制在 30000,避免恶意设置。
性能增强
- 新版本对于只读事务的提交可以使用更少的 CPU 周期;
- 可以更早检测到由于一个或者多个表数据为空而导致的 JOIN 查询返回为空的情况。
- 如果标量子查询的结果不改变整个表达式的结果,可以省略子查询的计算。
- 当窗口函数使用了 BETWEEN :x FOLLOWING AND :y FOLLOWING 子句并且 :y 的值较大时,查询速度会更快。
SQL 函数
对于内置的 printf() 以及 format() 函数,如果指定了 # 标志并且没有指定 + 标志,同时所有数字都是 0,那么对于负的浮点数,不会显示最前面的负号(-)。
这就意味着我们可以使用“%#f”或者类似格式避免输出“-0.00”这样的结果,而是显示 “0.00”。
API
- 新增 PRAGMA wal_checkpoint=NOOP; 命令以及用于 sqlite3_wal_checkpoint_v2() 的 SQLITE_CHECKPOINT_NOOP 参数。
- 添加 sqlite3_set_errmsg() 接口,提供扩展插件设置错误代码和信息。
- 添加 sqlite3_db_status64() 接口,返回结果与已有的 sqlite3_db_status() 接口相同,但会返回 64 位结果。
- sqlite3_db_status() 和 sqlite3_db_status64() 接口添加 SQLITE_DBSTATUS_TEMPBUF_SPILL 选项,记录由于内存不足写入磁盘临时文件的字节数量。
- session 扩展中添加了 sqlite3changeset_apply_v3() 接口,可以将变更集应用到数据库。
- TCL 接口为 eval 命令增加了一个 -asdict 标志,用于将行数据类型设置为字典而不是数组。同时,用户自定义函数现在可以中断(break)执行并返回 NULL 值。
源码调整
carray 和 percentile 扩展已经内置到合并代码中,不过默认处于禁用状态,需要别在编译时使用 -DSQLITE_ENABLE_CARRAY 以及 -DSQLITE_ENABLE_PERCENTILE 选项来激活。
sqlite3.h 头文件中新增了三个宏定义:
- SQLITE_SCM_BRANCH,获取源代码的分支名称;
- SQLITE_SCM_TAGS,源代码 check-in 的标签列表(空格分隔);
- SQLITE_SCM_DATETIME,源代码 check-in 的 ISO-8601 日期和时间。
其他更新
- 改进了 FTS5 生成的错误信息。
- 对计算列强制执行 STRICT 类型。
- 改进了对 VxWorks 平台的支持。
- JavaScript/WASM 支持 64 位版本。官方标准构建版本仍然使用 32 位版本,只需要运行 make 就可以创建 64 位版本。
- 增强了对于应用程序使用 close() 命令破坏 Posix 咨询锁导致数据库损坏的防御能力。
完整的发行说明可以参考官方文档:
https://www.sqlite.org/releaselog/3_51_0.html
