从 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.mzph.cn/news/809278.shtml

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

相关文章

Swagger API 文档 | 技术选型

文章目录 必备知识选型方案 1:SpringFox选型方案 2:springdoc-openapi选型方案 3:Knife4j方案对比相关博文😂 背景 老项目是 SpringMVC 框架,使用的是 SpringFox 2.8.0 实现的 API 文档。新项目是 SpringBoot 3.x 框架,发现 SpringFox 已经停更了,故有了此次 API 文档的…

怎么在外地控制自家的电视

怎么在外地控制自家的电视 随着科技的进步和智能家居的普及,远程控制家中的电器设备已经成为现实。电视作为家庭娱乐的中心,远程控制功能更是备受关注。那么,如何在外地控制自家的电视呢?本文将为你提供详细的步骤和有价值的信息…

为什么要“挺”鸿蒙?

鸿蒙到底是什么? 随着5G、物联网等技术的快速发展,智能终端设备的应用场景也越来越广泛。为了满足不同设备间的互联互通需求,华为在2019年推出了自主研发的操作系统——鸿蒙OS。值得关注的是,这也是首款国产操作系统。 要了解鸿…

UE5学习日记——制作多语言版本游戏,同时初步学习UI制作、多语言化、控制器配置、独立进程测试、打包配置和快速批量翻译等

所有的文本类,无论变量还是控件等都能实现本地化,以此实现不同语言版本。 在这里先将重点注意标注一下: 所有文本类的变量、控件等都可以多语言;本地化控制板中收集、编译时,别忘了编译这一步;支持批量复制…

一探究竟:选择排序原理、实现与应用分析

在众多基础排序算法中,选择排序以其独特的工作机制和稳定的性能表现,吸引了众多算法学习者的关注。本文将深入剖析选择排序的原理、详细实现步骤,以及其在实际应用中的表现与适用场景,助您全面理解这一经典排序算法。 一、选择排…

ClickHouse--16--普通函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、日期函数1、时间或日期截取函数(返回非日期)2、时间或日期截取函数(返回日期)3、日期或时间日期生成函数 二、类…

PTA 应急救援站选址(floyd+打印路径)

大学城虎溪社区有很多居民小区,居民小区道路图是连通的。现要在该社区新建一个应急救援站,且该应急救援站要和某个小区建在一起。为了使应急救援最快速,经各部门商量决定:应急救援站建好后,离应急救援站最远的小区到应…

使用 Axios 处理 AxiosError 的三种常见方法

在使用 Axios 时处理 AxiosError 有几种常见的方法: 使用 try-catch 语句捕获异常: try {const response await axios.get(/api/data);// 处理响应数据 } catch (error) {if (error.response) {// 请求成功但状态码不在 2xx 范围console.log(error.response.data);console.l…

React Hooks全面解读与高效开发实践

React Hooks是React 16.8版本引入的新特性,它可以让函数式组件具有类组件的能力。通过使用Hooks,我们可以在不编写类的情况下,使用状态(state)和其他React特性,使得组件的开发更加简单和高效。 在React中&…

Git - 设置全局用户名和邮箱

环境信息 Git 版本信息: $ git --version git version 2.33.0.windows.1设置全局用户名和邮箱 设置全局用户名: $ git config --global user.name "hello"设置全局邮箱: $ git config --global user.email "1234567890qq…

Web刷题记录——不翼而飞的余额

一、代码及思路解析 1、创建路由 // TODO:待补充代码,在此引入路由相关 API const { createRouter,createWebHistory } VueRouter; // TODO:待补充代码,为项目配置 history 模式的路由 const router createRouter({// 1、配置路由模式[…

单例模式以及常见的两种实现模式

单例模式是校招中最常考的设计模式之一. 设计模式其实就是类似于“规章制度”,按照这个套路来进行操作。 单例模式能保证某个类在程序中只存在唯一 一份实例。而不会创建出多个实例,如果创建出了多个实例,就会编译报错。而不会创建出多个实…

element-ui backtop 组件源码分享

今日简单分享 backtop 组件的源码实现,从以下三个方面: 1、backtop 组件页面结构 2、backtop 组件属性 3、backtop 组件事件 一、backtop 组件页面结构 二、backtop 组件属性 2.1 target 属性,触发滚动的对象,类型 string&am…

Java 流(Stream)、文件(File)和IO

Java 流(Stream)、文件(File)和IO 目录 Java 流(Stream)、文件(File)和IO 读取控制台输入 从控制台读取多字符输入 从控制台读取字符串 控制台输出 实例 读写文件 FileInputStream FileOutputStream 实例 文件和I/O Java中的目录 创建目录: 读取目录 Ja…

GitLab介绍、安装、创建第一个项目

一、Gitlab介绍 GitLab是一个基于Web的DevOps平台,提供了Git仓库管理、问题跟踪、代码审查、CI/CD等一系列功能。它由Dmitriy Zaporozhets和Valery Sizov于2011年创建,旨在为开发团队提供一个集中式的项目管理解决方案。以下是GitLab的一些关键特点和功能: 1、代码管理 提供…

JavaGUI编程

目录 GUI概念 Swing概念 组件 容器组件 窗口(JFrame) 代码 运行 面板(JPanel) 代码 运行 布局管理器 FlowLayout 代码 运行 BorderLayout 代码 运行 GridLayout 代码 运行 常用组件 标签(JLabel) 代码 运…

HarmonyOS实战开发-WebSocket的使用。

介绍 本示例展示了WebSocket的使用,包括客户端与服务端的连接和断开以及客户端数据的接收和发送。 WebSocket连接:使用WebSocket建立服务器与客户端的双向连接,需要先通过createWebSocket方法创建WebSocket对象,然后通过connect…

HarmonyOS实战开发-证书管理、如何实现对签名数据进行校验功能。

介绍 本示例使用了ohos.security.certManager相关接口实现了对签名数据进行校验的功能。 实现场景如下: 1)使用正确的原始数据和签名数据进行签名校验场景:模拟服务端对签名数据进行校验,验证客户端身份和原始数据完整性。 2&…

多线程(46)线程局部存储

线程局部存储(Thread Local Storage, TLS)是一种允许数据在多个线程中被独立地存储的编程范式。在Java中,这通过ThreadLocal类实现,它提供了一种线程封闭的机制,确保每个线程都有自己的变量副本,从而避免了变量共享所带来的线程安…

MongoDB聚合运算符:$objectToArray

文章目录 语法使用例1,无内嵌文档的情况例2,有内嵌文档的情况 举例objectToAarray 举例使用objectToArray对内嵌字段求和 o b j e c t T o A r r a y 与 objectToArray与 objectToArray与arrayToObject一起使用的例子 $objectToArray聚合运算符用于将文档…