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

相关推荐
努力学习的小廉2 小时前
初识MYSQL —— 复合查询
android·数据库·mysql
【D'accumulation】3 小时前
.NET Framework 4.8 + Microsoft.Data.Sqlite 报 Library e_sqlite3 not found
microsoft·sqlite·.net
NPE~3 小时前
[手写系列]Go手写db — — 第七版(实现Disk存储引擎、Docker化支持)
数据库·后端·docker·golang·教程·手写数据库
workflower3 小时前
FDD与其他方法的相似和区别
数据库·算法·需求分析·个人开发
WeiQ_6 小时前
解决phpstudy 8.x软件中php8.2.9没有redis扩展的问题
数据库·redis·缓存
DashVector10 小时前
向量检索服务 DashVector产品计费
数据库·数据仓库·人工智能·算法·向量检索
KYGALYX11 小时前
在Linux中备份msyql数据库和表的详细操作
linux·运维·数据库
檀越剑指大厂11 小时前
金仓KReplay:定义数据库平滑迁移新标准
数据库