从 SQLite 3.5.9 迁移到 3.6.0(二十一)

 返回: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 不兼容更改概述

  1. 对 sqlite3_vfs 对象的更改

    1. xAccess 方法的签名已修改为 返回错误代码并将其输出存储到指向的整数中 到,而不是直接返回输出。 此更改允许 xAccess() 方法报告失败。 与此签名更改相关联,新的 添加了扩展错误代码SQLITE_IOERR_ACCESS。

    2. xGetTempname 方法已从sqlite3_vfs中删除。 取而代之的是,xOpen 方法得到了增强,可以打开临时文件 当 filename 参数为 NULL 时,它自己发明的。

    3. 添加了 xGetLastError() 方法到sqlite3_vfs以返回 特定于文件系统的错误消息和错误代码返回 SQLite的。

  2. 修改了 sqlite3_io_methods 上 xCheckReservedLock 方法的签名,以便它返回错误代码并存储其 布尔结果转换为参数指向的整数。在 与此更改关联,添加了新的扩展错误代码SQLITE_IOERR_CHECKRESERVEDLOCK。

  3. 当SQLite被移植到新的操作系统(操作系统 Unix、Windows 和 OS/2 除外,这些端口一起提供 与核心) 两个新函数 sqlite3_os_init() 和 sqlite3_os_end() 必须 作为端口的一部分提供。

  4. IN 和 NOT IN 运算符处理 NULL 值的方式 在他们的右手表达中已经符合 SQL 标准和其他 SQL 数据库引擎。

  5. SELECT 语句的结果集的列名具有 在某些情况下进行了调整,使其更像其他 SQL 数据库一样工作 发动机。

  6. 对编译时选项的更改:

    1. SQLITE_MUTEX_APPDEF compile-time 参数不再是 认可。作为替代,可以创建替代互斥锁实现 在运行时将 sqlite3_config() 与 SQLITE_CONFIG_MUTEX 运算符和 sqlite3_mutex_methods 对象一起使用。

    2. 编译时选项 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 添加了以下向后兼容的更改和 增强:

  1. 新的 sqlite3_config() 接口允许应用程序 自定义 SQLite 在运行时的行为。可定制 使用 sqlite3_config() 包括以下内容:

    1. 使用带有 sqlite3_mutex_methods 对象的 SQLITE_CONFIG_MUTEX 谓词指定备用互斥锁实现。

    2. 使用带有 sqlite3_mem_methods 对象的 SQLITE_CONFIG_MALLOC 谓词指定替代 malloc 实现。

    3. 部分或完全禁用使用 SQLITE_CONFIG_SINGLETHREAD、SQLITE_CONFIG_MULTITHREAD 和 SQLITE_CONFIG_SERIALIZED 的互斥锁。

  2. 一个新的标志SQLITE_OPEN_NOMUTEX可用于 sqlite3_open_v2() 接口。

  3. 新的 sqlite3_status() 接口允许应用程序查询 SQLite在运行时的性能状态。

  4. sqlite3_memory_used() 和 sqlite3_memory_highwater() 接口已弃用。等效功能现已推出 通过 sqlite3_status()。

  5. 可以显式调用 sqlite3_initialize() 接口 初始化 SQLite 子系统。sqlite3_initialize() 接口是 调用某些接口时自动调用,因此不需要使用 sqlite3_initialize(),但建议使用。

  6. sqlite3_shutdown() 接口导致 SQLite 释放任何 系统资源(内存分配、互斥锁、打开文件句柄) 这可能是由 sqlite3_initialize() 分配的。

  7. sqlite3_next_stmt() 接口允许应用程序发现 与数据库连接关联的所有预准备语句。

  8. 添加了page_count PRAGMA,用于返回基础的大小 数据库文件(以页面为单位)。

  9. 添加了新的 R*Tree 索引扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/619633.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB源码-第16期】基于matlab的MSK定是同步仿真,采用gardner算法和锁相环

1、算法描述 **锁相环(PLL)** 是一种控制系统,用于将一个参考信号的相位与一个输入信号的相位同步。它在许多领域中都有应用,如通信、无线电、音频、视频和计算机系统。锁相环通常由以下几个关键组件组成: 1. **相位…

PostgreSQL入门到实战-第二十七弹

PostgreSQL入门到实战 PostgreSQL中数据分组操作(二)官网地址PostgreSQL概述PostgreSQL中HAVING命令理论PostgreSQL中HAVING命令实战更新计划 PostgreSQL中数据分组操作(二) 使用PostgreSQL HAVING子句来指定组或聚合的搜索条件 官网地址 声明: 由于操作系统, 版本更新等原因…

华为OD机试 - 内存冷热标记(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…

经久耐用特氟龙材质塑料烧杯PFA坩埚耐受强酸强碱耐高温

PFA烧杯在实验过程中可作为储酸容器或涉及强酸强碱类实验的反应容器,用于盛放样品、试剂,可搭配电热板加热、蒸煮、赶酸用。 PFA烧杯规格参考:10ml、30ml、50ml、100ml、250ml、500ml、1000ml、2000ml。 外壁均有凸起刻度,直筒设…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.6 年初操作:科目余额结转

2.6.6 年初操作:科目余额结转 在使用事务代码 FAGLB03 查询科目余额时,可以看到按期间的发生额清单。其中,第一行称为“余额结转”,该行的累计余额代表上年度遗留下来的余额,也就是年初余额。对于资产负债表科目而言&a…

高清4路HDMI编码器JR-3214HD

产品简介: JR-3214HD四路高清HDMI编码器是专业的高清音视频编码产品,该产品具有支持4路高清HDMI音视频采集功能,4路3.5MM独立外接音频输入,编码输出双码流H.264格式,音频MP3/AAC格式。编码码率可调,画面质…

2024最新 PyCharm 2024.1 更新亮点看这篇就够了

2024最新 PyCharm 2024.1 更新亮点看这篇就够了 文章目录 2024最新 PyCharm 2024.1 更新亮点看这篇就够了🚀 PyCharm 2024.1 发布:全面升级,助力高效编程!摘要引言 🚀 快速掌握 Hugging Face:模型与数据集文…

武汉星起航助力跨境电商,专业选品与全方位服务引领行业新风尚

在全球跨境电商浪潮的推动下,越来越多的卖家纷纷将目光投向了这片广阔的市场。然而,如何在这片蓝海中脱颖而出,成为众多卖家关注的焦点。武汉星起航电子商务有限公司以其专业的选品建议和全方位的服务,为卖家们提供了一条成功的捷…

通讯录的实现(单链表版本)

我们首先要知道通讯录的实现是基于单链表的基础上的,所以我们首先要搞懂单链表。(注意:今天的代码量较多),但这不是阻挡我们前进的脚步,冲冲冲!!! 单链表的简要概述 我们…

python-study-day1-(病人管理系统-带sql)

MainWindow代码 from tkinter import * from tkinter import messagebox from tkinter.ttk import Comboboxclass MianWindow(Frame):def __init__(self, masterNone):super().__init__(master, padx30, pady20)self.flag 0self.pack(expandTrue, fillBOTH)self.id StringVa…

七大设计原则

在软件开发的领域中,随着技术的不断进步和市场需求的不断变化,软件系统的设计和维护变得越来越重要。为了确保软件系统能够长期有效地运行,并且能够在未来的发展中适应新的需求和技术变化,提高软件系统的可维护性和可复用性成为了…

【数字IC/FPGA】什么是无符号数?什么是有符号数?

进制 虽然在日常生活中,我们已经习惯了使用10进制数字,但在由数字电路构成的数字世界中,2进制才是效率更高的选择。 10进制与2进制 10进制(decimal)计数法(一般也叫阿拉伯计数法)是在日常生活…