返回:SQLite—系列文章目录
上一篇:从 SQLite 3.4.2 迁移到 3.5.0(二十)
下一篇:SQLite从出生到现在(发布历史记录)(二十二)
SQLite 版本 3.6.0 (2008-07-16) 包含许多更改。按照惯例 SQLite项目,大多数更改都是完全向后兼容的。 但是,版本 3.6.0 中的一些更改不兼容,并且 可能需要修改应用程序代码和/或生成文件。 本文档简要介绍了 SQLite 3.6.0 中的变化 特别注意不兼容的更改。
要点:
- 数据库文件格式保持不变。
- 所有不兼容都位于晦涩难懂的接口上,因此应该 对大多数应用程序的影响为零。
1.0 不兼容的更改
首先涵盖不兼容的更改,因为它们是最 对维护者和程序员很重要。
1.1 不兼容更改概述
-
对 sqlite3_vfs 对象的更改
-
xAccess 方法的签名已修改为 返回错误代码并将其输出存储到指向的整数中 到,而不是直接返回输出。 此更改允许 xAccess() 方法报告失败。 与此签名更改相关联,新的 添加了扩展错误代码SQLITE_IOERR_ACCESS。
-
xGetTempname 方法已从sqlite3_vfs中删除。 取而代之的是,xOpen 方法得到了增强,可以打开临时文件 当 filename 参数为 NULL 时,它自己发明的。
-
添加了 xGetLastError() 方法到sqlite3_vfs以返回 特定于文件系统的错误消息和错误代码返回 SQLite的。
-
-
修改了 sqlite3_io_methods 上 xCheckReservedLock 方法的签名,以便它返回错误代码并存储其 布尔结果转换为参数指向的整数。在 与此更改关联,添加了新的扩展错误代码SQLITE_IOERR_CHECKRESERVEDLOCK。
-
当SQLite被移植到新的操作系统(操作系统 Unix、Windows 和 OS/2 除外,这些端口一起提供 与核心) 两个新函数 sqlite3_os_init() 和 sqlite3_os_end() 必须 作为端口的一部分提供。
-
IN 和 NOT IN 运算符处理 NULL 值的方式 在他们的右手表达中已经符合 SQL 标准和其他 SQL 数据库引擎。
-
SELECT 语句的结果集的列名具有 在某些情况下进行了调整,使其更像其他 SQL 数据库一样工作 发动机。
-
对编译时选项的更改:
-
SQLITE_MUTEX_APPDEF compile-time 参数不再是 认可。作为替代,可以创建替代互斥锁实现 在运行时将 sqlite3_config() 与 SQLITE_CONFIG_MUTEX 运算符和 sqlite3_mutex_methods 对象一起使用。
-
编译时选项 OS_UNIX、OS_WIN、OS_OS2、OS_OTHER和 TEMP_STORE已重命名,以按顺序包含“SQLITE_”前缀 以帮助避免与应用程序软件的命名空间冲突。这 这些选项的新名称分别是: SQLITE_OS_UNIX、SQLITE_OS_WIN、SQLITE_OS_OS2、SQLITE_OS_OTHER、 和SQLITE_TEMP_STORE。
-
1.2 对 VFS 层的更改
SQLite 版本 3.5.0 引入了一个新的操作系统接口层, 提供了底层操作系统的抽象。 这是一项重要的创新,并已被证明是有帮助的 在移植和维护 SQLite 中。 但是,开发人员发现了一些小缺陷 3.5.0 版中引入的原始“虚拟文件系统”设计 因此,SQLite 3.6.0包含一些不兼容的小更改 来解决这些缺陷。
眼:不相容的 版本 3.6.0 的 SQLite 操作系统界面中的更改 仅影响使用 虚拟文件系统接口的罕见应用程序或 提供应用程序定义的 互斥锁实现或使用其他晦涩难懂的编译时选项。这 SQLite 3.6.0 版引入的更改对 绝大多数使用内置接口的 SQLite 应用程序 到 Unix、Windows 和 OS/2,并使用标准构建配置。
1.3 IN 运算符处理 NULL 的方式的变化
SQLite的所有版本(包括3.5.9版本)都处理不当 IN 和 NOT IN 运算符右侧的 NULL 值。 具体来说,SQLite以前忽略了右侧的NULL 的 IN 和 NOT IN。
假设我们有一个表 X1,定义如下:
CREATE TABLE x1(x INTEGER);INSERT INTO x1 VALUES(1);INSERT INTO x1 VALUES(2);INSERT INTO x1 VALUES(NULL);
鉴于上面 X1 的定义,以下表达式具有 在SQLite中历来评估为FALSE,尽管是正确的 答案实际上是 NULL:
3 IN (1,2,NULL)3 IN (SELECT * FROM x1)
同样,以下表达式历来计算为 TRUE,实际上 NULL 也是这里的正确答案:
3 NOT IN (1,2,NULL)3 NOT IN (SELECT * FROM x1)
根据 SQL:1999,SQLite 的历史行为不正确 标准,它与 MySQL 和 PostgreSQL。版本 3.6.0 更改了 IN 和 NOT IN运算符符合标准并给出相同的标准 结果与其他 SQL 数据库引擎一样。
眼:对 NULL 值处理方式的更改 从技术上讲,IN 和 NOT IN 运算符是错误修复,而不是设计 改变。但是,维护人员应检查以确保应用程序 在升级到 版本 3.6.0。
1.4 列命名规则的更改
联接子查询报告的列名略有修改 为了更像其他数据库引擎一样工作。请考虑以下几点 查询:
CREATE TABLE t1(a);CREATE TABLE t2(x);SELECT * FROM (SELECT t1.a FROM t1 JOIN t2 ORDER BY t2.x LIMIT 1) ORDER BY 1;
在版本 3.5.9 中,上面的查询将返回一个名为“t1.a”的列。 在版本 3.6.0 中,列名称仅为“a”。
SQLite 从未对 SELECT 语句的结果集,除非该列包含 AS 子句。 因此,从技术上讲,对列名的更改并不是不兼容的。 SQLite只是从一个未定义的行为更改为另一个未定义的行为。 然而,许多应用程序依赖于未指定的列命名 SQLite 的行为,因此此更改将在 不兼容的更改副标题。
1.5 编译时选项的更改
SQLite 的编译时选项由 C 预处理器控制 宏。SQLite 版本 3.6.0 更改了其中一些的名称 宏,以便所有特定于 SQLite以“SQLITE_”前缀开头。这样做是为了减少 与其他软件模块发生名称冲突的风险。
眼:对编译时选项的更改具有 可能会影响执行自定义构建的项目中的生成文件 SQLite的。这些更改对应用程序代码的影响应为零,并且 大多数使用标准、默认构建的 SQLite 的项目。
2.0 完全向后兼容的增强功能
除了上面列出的不兼容的更改外,SQLite 版本 3.6.0 添加了以下向后兼容的更改和 增强:
-
新的 sqlite3_config() 接口允许应用程序 自定义 SQLite 在运行时的行为。可定制 使用 sqlite3_config() 包括以下内容:
-
使用带有 sqlite3_mutex_methods 对象的 SQLITE_CONFIG_MUTEX 谓词指定备用互斥锁实现。
-
使用带有 sqlite3_mem_methods 对象的 SQLITE_CONFIG_MALLOC 谓词指定替代 malloc 实现。
-
部分或完全禁用使用 SQLITE_CONFIG_SINGLETHREAD、SQLITE_CONFIG_MULTITHREAD 和 SQLITE_CONFIG_SERIALIZED 的互斥锁。
-
-
一个新的标志SQLITE_OPEN_NOMUTEX可用于 sqlite3_open_v2() 接口。
-
新的 sqlite3_status() 接口允许应用程序查询 SQLite在运行时的性能状态。
-
sqlite3_memory_used() 和 sqlite3_memory_highwater() 接口已弃用。等效功能现已推出 通过 sqlite3_status()。
-
可以显式调用 sqlite3_initialize() 接口 初始化 SQLite 子系统。sqlite3_initialize() 接口是 调用某些接口时自动调用,因此不需要使用 sqlite3_initialize(),但建议使用。
-
sqlite3_shutdown() 接口导致 SQLite 释放任何 系统资源(内存分配、互斥锁、打开文件句柄) 这可能是由 sqlite3_initialize() 分配的。
-
sqlite3_next_stmt() 接口允许应用程序发现 与数据库连接关联的所有预准备语句。
-
添加了page_count PRAGMA,用于返回基础的大小 数据库文件(以页面为单位)。
-
添加了新的 R*Tree 索引扩展。