网站的权重,开发,电商行业建设网站,产品类网站返回#xff1a;SQLite—系列文章目录
上一篇#xff1a;从 SQLite 3.4.2 迁移到 3.5.0#xff08;二十#xff09;
下一篇#xff1a;SQLite—系列文章目录 SQLite 版本 3.6.0 #xff08;2008-07-16#xff09; 包含许多更改。按照惯例 SQLite项目#xff… 返回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)根据 SQL1999SQLite 的历史行为不正确 标准它与 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 索引扩展。