Sqlite数据库详解

1.关于Sqlite

SQLite 是一个进程内库,它实现了一个独立的、无服务器的、零配置的事务性 SQL 数据库引擎。 SQLite的代码属于公共领域,因此对 用于任何目的,商业或私人目的。 SQLite是世界上部署最广泛的数据库 应用程序比我们能做的要多 计数,包括几个备受瞩目的项目。

SQLite 是一个嵌入式 SQL 数据库引擎。 与大多数其他 SQL 数据库不同,SQLite 没有单独的 服务器进程。SQLite直接读取和写入普通磁盘 文件。一个完整的 SQL 数据库,包含多个表、索引、 触发器和视图包含在单个磁盘文件中。 数据库文件格式是跨平台的 - 您可以自由复制数据库 在 32 位和 64 位系统之间或 big-endian 和 little-endian 体系结构之间。这些功能使 SQLite 成为受欢迎的选择,因为 应用程序文件格式。SQLite 数据库文件是美国国会图书馆推荐的存储格式。 不要把SQLite看作是Oracle的替代品,而是 作为 fopen() 的替代品。

SQLite 是一个紧凑的库。 启用所有功能后,库大小可以小于 750KiB, 取决于目标平台和编译器优化设置。 (64 位代码较大。以及一些编译器优化 例如激进的功能内联和循环展开会导致 目标代码要大得多。 内存使用量和速度之间存在权衡。 SQLite通常你给它内存越多,运行得越快,。尽管如此,在低内存环境中性能通常也相当不错。根据其使用方式,SQLite 可能比直接文件系统 I/O 更快。

2.SQLite的适当用途

SQLite 不能直接与客户端/服务器 SQL 数据库引擎相提并论,例如 作为 MySQL、Oracle、PostgreSQL 或 SQL Server,因为 SQLite 正在尝试 解决不同的问题。

客户端/服务器 SQL 数据库引擎努力实现共享存储库 的企业数据。他们强调可扩展性、并发性、中心化、 和控制。 SQLite致力于为以下对象提供本地数据存储 单独的应用程序和设备。SQLite强调经济性, 高效、可靠、独立和简单。

SQLite不与客户端/服务器数据库竞争。 SQLite 与 fopen() 竞争。

2.1.SQLite运行良好的情况

2.1.1. 嵌入式设备和物联网

由于 SQLite 数据库不需要管理, 它适用于必须在没有专家人工支持的情况下运行的设备。 SQLite 非常适合用于 手机、机顶盒、电视机、游戏机、 相机、手表、厨房电器、恒温器、汽车、 机床、飞机、遥感器、无人机、医疗设备、 和机器人:“物联网”。

客户机/服务器数据库引擎被设计为驻留在网络核心的一个受人喜爱的数据中心内。SQLite也在那里工作,但SQLite也在网络边缘蓬勃发展,在为应用程序提供快速可靠的数据服务的同时,为那些连接不可靠的应用程序提供了自己的服务。

2.1.2. 应用程序文件格式

SQLite 通常用作磁盘上的文件格式 对于版本控制系统等桌面应用程序, 财务分析工具、媒体编目和编辑套件、CAD 包、记录保存程序等。传统的 File/Open 操作调用 sqlite3_open() 以附加到数据库 文件。修订应用程序内容时会自动进行更新 因此,“文件/保存”菜单选项变得多余。文件/Save_As menu 选项可以使用备份 API 实现。

这种方法有很多好处,包括改进 性能,降低成本和复杂性,以及 提高可靠性。

3.SQLite的显着特点

3.1.零配置

SQLite在使用之前不需要“安装”。 没有“设置”程序。没有 需要启动、停止或配置的服务器进程。 有 管理员无需创建新的数据库实例或分配 用户的访问权限。 SQLite不使用配置文件。 无需执行任何操作即可告诉系统 SQLite 正在运行。 在系统崩溃或电源故障后,无需执行任何操作即可恢复。 无需进行任何故障排除。

SQLite只是工作。

其他更熟悉的数据库引擎一旦启动,就会运行良好。 但是进行初始安装和配置可以 令人生畏的复杂。

3.2.无服务器

(另请参阅无服务器文档页面。

大多数 SQL 数据库引擎都是作为单独的服务器实现的 过程。想要访问数据库的程序进行通信 与服务器使用某种进程间通信 (通常为 TCP/IP)向服务器发送请求并接收 返回结果。SQLite不是这样工作的。使用 SQLite, 想要访问数据库的进程读取和写入 直接从磁盘上的数据库文件。没有中介 服务器进程。

无服务器有优点也有缺点。这 主要优点是没有单独的服务器进程 安装、设置、配置、初始化、管理和故障排除。 这就是为什么SQLite是“零配置”数据库的原因之一 发动机。使用 SQLite 的程序不需要管理支持 用于在运行数据库引擎之前设置它们。任何程序 能够访问磁盘的,能够使用 SQLite 数据库。

另一方面,使用服务器的数据库引擎可以提供 更好地防止客户端应用程序中的错误 - 杂散指针 在客户端中,无法损坏服务器上的内存。而且因为服务器 是一个单一的持久性进程,它能够控制数据库访问 更高的精度,允许更精细的粒度锁定和更好的并发性。

大多数 SQL 数据库引擎都是基于客户端/服务器的。在那些 无服务器,SQLite 是笔者唯一知道的 允许多个应用程序同时访问同一数据库。

3.3单一数据库文件

SQLite数据库是一个普通的磁盘文件,可以定位 目录层次结构中的任意位置。如果SQLite可以读取 磁盘文件,然后它可以读取数据库中的任何内容。如果磁盘 文件及其目录是可写的,那么SQLite可以更改任何内容 在数据库中。数据库文件可以很容易地复制到USB上 记忆棒或通过电子邮件发送以供共享。

其他 SQL 数据库引擎倾向于将数据存储为大量 文件。通常,这些文件位于标准位置,只有 数据库引擎本身可以访问。这使得数据更加安全, 但也使它更难访问。某些 SQL 数据库引擎提供 直接写入磁盘并绕过文件系统的选项 完全。这提供了额外的性能,但代价是 相当大的设置和维护复杂性。

3.4.稳定的跨平台数据库文件

SQLite 文件格式是跨平台的。写入的数据库文件 在一台计算机上可以复制到另一台计算机上并使用 不同的架构。Big-endian 或 little-endian,32 位或 64 位无关紧要。所有计算机都使用相同的文件格式。 此外,开发人员已承诺保留文件格式 稳定且向后兼容,因此较新版本的 SQLite 可以 读取和写入较旧的数据库文件。

大多数其他 SQL 数据库引擎都要求您转储和还原 从一个平台移动到另一个平台时的数据库,并且经常 升级到较新版本的软件时。

3.5.紧凑的

当针对大小进行优化时,整个 SQLite 库将启用所有内容 大小小于 500KiB(在 ix86 上使用“大小”测量 GNU 编译器套件中的实用程序。可以禁用不需要的功能 在编译时,将库的大小进一步减小到 如果需要,300KiB。

大多数其他 SQL 数据库引擎都比这大得多。IBM 引以为豪 其最近发布的 CloudScape 数据库引擎“仅”为 2MiB jar 文件 - 比 SQLite 大一个数量级,即使它是 压缩! Firebird 吹嘘其客户端库只有 350KiB。那是 和 SQLite 一样大,甚至不包含数据库引擎。 Oracle 的 Berkeley DB 库是 450KiB,它省略了 SQL 支持,仅为程序员提供简单的键/值对。

3.6.清单类型

大多数 SQL 数据库引擎都使用静态类型。数据类型已关联 表中的每一列,并且仅包含该特定数据类型的值 允许存储在该列中。SQLite放宽了此限制 通过使用清单类型。 在清单类型中,数据类型是值本身的属性,而不是 存储值的列。 因此,SQLite允许用户存储 任何数据类型的任何值放入任何列中,而不管声明的类型如何 该列。(此规则有一些例外:INTEGER PRIMARY KEY 列只能存储整数。SQLite试图胁迫 值转换为列的声明数据类型(如果可以)。

据我们所知,SQL 语言规范允许使用 清单类型。尽管如此,大多数其他 SQL 数据库引擎都是 静态类型,所以有些人 觉得使用清单类型是SQLite中的一个错误。但是作者 的SQLite非常强烈地认为这是一个功能。清单的使用 在SQLite中键入是一个经过深思熟虑的设计决策,已在实践中得到证明 使 SQLite 更可靠、更易于使用,尤其是在用于 与动态类型编程语言(如 Tcl 和 蟒。

3.7.可变长度记录

大多数其他 SQL 数据库引擎都分配了固定数量的磁盘空间 对于大多数表中的每一行。他们玩特殊的处理技巧 BLOB 和 CLOB,它们的长度可能千差万别。但对于大多数人来说 表,如果将一列声明为 VARCHAR(100),则数据库 引擎将分配 100 字节的磁盘空间,无论您实际有多少信息 存储在该列中。

相比之下,SQLite仅使用实际的磁盘空间量 需要将信息存储在一行中。如果您存储单个 字符,则只有磁盘的一个字节 空间被占用。(实际上是两个字节 - 有一些开销 每列的开头,以记录其数据类型和长度。

SQLite 使用可变长度记录具有许多优点。 显然,它会导致更小的数据库文件。它还使 数据库运行速度更快,因为要移入和移出的信息更少 磁盘。而且,使用可变长度记录可以 SQLite 采用清单类型而不是静态类型。

3.8.可读的源代码

SQLite的源代码被设计为可读和可访问的 普通的程序员。所有过程和数据结构以及许多 自动变量被仔细注释,并带有以下有用的信息 他们做什么。省略了样板注释。

3.9.SQL 语句编译为虚拟机代码

每个 SQL 数据库引擎都会将每个 SQL 语句编译为某种 内部数据结构,然后用于执行 陈述。但是在大多数 SQL 引擎中,内部数据结构是 由相互关联的结构和对象组成的复杂网络。在 SQLite 中,编译的 语句形式是机器语言中的简短程序,例如 表示法。数据库的用户可以通过在前面加上 EXPLAIN 关键字来查看此虚拟机语言 添加到查询中。

在SQLite中使用虚拟机对 图书馆的发展。虚拟机提供清晰、定义明确的 SQLite前端(解析SQL的部分)之间的交汇点 语句并生成虚拟机代码)和后端( 执行虚拟机代码并计算结果的部分。 虚拟机允许开发人员清楚地看到,并在 易于阅读的 SQLite 尝试对每个语句执行的操作 它可以编译,这对调试有很大的帮助。 根据它的编译方式,SQLite 还具有以下功能: 跟踪虚拟机的执行 - 打印每个 虚拟机指令及其执行时的结果。

3.10.SQL 语言扩展

SQLite 为 SQL 语言提供了许多增强功能 在其他数据库引擎中通常找不到。 前面已经提到了 EXPLAIN 关键字和清单类型 以上。SQLite 还提供诸如 REPLACE 和 ON CONFLICT 子句之类的语句,这些语句允许 添加了对解决约束冲突的控制。 SQLite 支持允许多个 ATTACH 和 DETACH 命令 在同一查询中一起使用的独立数据库。 SQLite定义了API,允许用户添加新的SQL函数和整理序列。

4.SQLite中的一些说明

4.1.SQLite是嵌入式的,而不是客户端-服务器

每当将 SQLite 与其他 SQL 数据库引擎进行比较时,例如 SQL Server、PostgreSQL、MySQL 或 Oracle,首先很重要 意识到SQLite并非旨在替代或竞争对手 这些系统中的任何一个。SQLite 是无服务器的。没有单独的 管理数据库的服务器进程。应用程序交互 使用数据库引擎使用函数调用,而不是通过发送消息 到单独的进程或线程。

事实上,SQLite是嵌入式和无服务器的,而不是 客户端/服务器是一个功能,而不是一个错误。

客户端/服务器数据库,如 MySQL、PostgreSQL、SQL Server、Oracle 和 其他的则是现代系统的重要组成部分。 这些系统解决了一个重要问题。 但是SQLite解决了一个不同的问题。 SQLite 和客户端/服务器数据库都有其作用。 将 SQLite 与其他 SQL 数据库引擎进行比较的开发人员需要 以清楚地理解这种区别。

4.2.灵活的数据类型

SQLite在数据类型方面是灵活的。数据类型是建议性的 而不是强制性的。

一些评论家说SQLite是“弱类型”,而其他 SQL 数据库是“强类型”的。我们认为这些条款是 不准确,甚至贬义。我们更愿意说SQLite是 “灵活类型”,其他 SQL 数据库引擎是 “刚性类型”。

4.2.1.没有单独的布尔数据类型

与大多数其他 SQL 实现不同, SQLite 没有单独的 BOOLEAN 数据类型。 相反,TRUE 和 FALSE (通常)表示为整数 1 和 0, 分别。 这似乎不会造成很多问题,因为我们很少收到投诉 关于它。但重要的是要认识到这一点。

从 SQLite 版本 3.23.0 (2018-04-02) 开始,SQLite 还 将 TRUE 和 FALSE 关键字识别为整数值 1 和 0 的别名, 分别。 这提供了与其他 SQL 实现的更好兼容性。 但为了向后兼容,如果有名为 TRUE 或 FALSE,则这些关键字将被视为引用这些关键字的标识符 列,而不是布尔文本。

4.2.2.没有单独的 DATETIME 数据类型

SQLite 没有 DATETIME 数据类型。 相反,可以通过以下任何一种方式存储日期和时间:

作为 ISO-8601 格式的 TEXT 字符串。示例:“2018-04-02 12:13:46”。
作为自 1970 年以来的整数秒数(也称为“unix 时间”)。

4.2.3.数据类型是可选的

因为SQLite在数据类型方面是灵活和宽容的, 可以创建完全没有指定数据类型的表列。 例如:

CREATE TABLE t1(a,b,c,d);

表“t1”有四列“a”、“b”、“c”和“d”,它们具有 未分配特定数据类型。你可以存储任何你想要的东西 这些列中的任何一个。

4.2.4.默认情况下,外键强制执行处于关闭状态

4.2.5.PRIMARY KEYs 有时可以包含 NULL

4.2.13.SQLite 区分整数和文本文字

SQLite 表示以下查询返回 false:

SELECT 1='1';

它之所以这样做,是因为整数不是字符串。 其他所有主要的 SQL 数据库引擎都说这是真的,这是有原因的 SQLite的创建者不明白。

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

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

相关文章

分披萨 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 “吃货”和“馋嘴”两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。 但是粗心服务员将披萨切成了每块大小…

【c语言】字符函数和字符串函数(上)

前言 在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 前言 1. 字符分…

@ 代码随想录算法训练营第9周(C语言)|Day62(单调栈)

代码随想录算法训练营第9周(C语言)|Day62(单调栈) Day25、回溯(包含题目 739. 每日温度 496.下一个更大元素 I ) 739. 每日温度 题目描述 请根据每日 气温 列表,重新生成一个列表。对应位置…

前端有哪些实现埋点、性能监控、告警的方式

前端错误监控: 通过监控前端错误来捕获客户端的异常和错误。可以使用第三方服务如Sentry、Bugsnag、Rollbar等,或者自行实现错误监控系统。 性能监控: 监控页面加载时间、资源加载时间、渲染时间等性能指标,以及页面的可交互性能…

Vue 卸载eslint

卸载依赖 npm uninstall eslint --save 然后 进入package.json中,删除残留信息。 否则在执行卸载后,运行会报错。 之后再起项目。

pthread_exit和pehread_join函数

pthread_exit: 在线程中禁止调用exit函数,否则会导致整个进程退出,取而代之的是调用pthread_exit函数,这个函数只会使一个线程退出,如果主线程使用pthread_exit函数也不会使整个进程退出,不会影响其他线程…

扫描TestNG框架编写的自动化用例确认其中是否包含断言的方法

在测试工作中,要确认TestNG框架编写的自动化用例中是否包含断言,我们可以使用一些静态代码分析工具。静态代码分析工具可以在不执行代码的情况下检查代码,发现可能的错误、代码异味或者不符合编码规范的地方。对于TestNG框架,一种…

Python元组详细教程

Python中的元组(tuple)是一种不可变的有序序列类型,用于存储多个值。由于元组是不可变的,因此你不能修改元组中的元素,但你可以访问和操作元组中的元素。 创建元组 你可以使用圆括号 () 来创建元组,元组中…

新媒体运营-定位及呈现方式篇

常见呈现方式:真人口述、小剧情、记录(边走边说)、Vlog+场景、画外音+场景、视频/图+文案 标题 是写给潜在客户看的, 内容 是给我们的目标用户看的。 01 要有核心内容 写文案从模仿开始,依样画葫芦 然后形成一套顺手的体系公式 02 要方便用户搜索 关键词、话题、连带关联词…

【JavaScript 漫游】【022】事件模型

文章简介 本篇文章为【JavaScript 漫游】专栏的第 022 篇文章,对 JavaScript 中事件模型相关的知识点进行了总结。 监听函数 浏览器的事件模型,就是通过监听函数(listener)对事件做出反应。事件发生后,浏览器监听到…

2.23日学习打卡----初学Nginx(二)

2.23日学习打卡 目录: 2.23日学习打卡一. Nginx 虚拟主机虚拟主机的分类Nginx支持三种类型的虚拟主机配置Nginx虚拟主机单网卡多IP配置Nginx虚拟主机_基于域名虚拟主机配置Nginx虚拟主机基于多端口的配置4 二. Nginx 核心指令root和alias指令的区别return指令rewrite指令rewrit…

MySQL-行转列,链接查询

1. 行转列 1.1 示例数据准备 create table test_9(id int,name varchar(22),course varchar(22),score decimal(18,2) ); insert into test_9 (id,name,course,score)values(1,小王,java,99); insert into test_9 (id,name,course,score)values(2,小张,java,89.2); inse…

【MATLAB源码-第148期】基于matlab的BP神经网络2/4ASK,2/4FSK,2/4PSK信号识别仿真。

操作环境: MATLAB 2022a 1、算法描述 1. 调制技术基础 调制技术是通信技术中的基础,它允许数据通过无线电波或其他形式的信号进行传输。调制可以根据信号的振幅、频率或相位的变化来进行,分别对应于ASK、FSK和PSK。 1.1 2ASK与4ASK 振幅…

西宾视频下载工具(mediadown)

一个支持多网站的视频下载工具。目前已经支持的网站有知乎、哔哩哔哩、得到、猫耳、蜻蜓FM。 西宾视频下载工具能够帮助你下载知乎知学堂、哔哩哔哩、得到课程、猫耳音频、蜻蜓FM的音视频文件。如果你是这些网站的会员,它还能帮你下载会员节目的音视频。 工具也不是…

【大厂AI课学习笔记NO.54】2.3深度学习开发任务实例(7)数据标注和数据集拆分

数据标注 有时我们会把特征工程和数据集的标注弄混淆,在普通的机器学习项目中,我们需要进行特征工程,但是在深度学习项目过程中,我们需要进行数据标注工作。 标注工具 在本案例中,使用的是开源的标注工具Labelme&am…

PureFlash v1.9.1特性介绍

PureFlashv1.9.1版本特性主要有3个: 1. 支持RDMA网络 使用RDMA协议可以大大减少对CPU的消耗,性能提升30%以上。 PureFlash的网络配置分为存储节点间网络(存储后端网)和客户端网络(前端网)。都支持使用RD…

Elasticsearch 创建index库 timeout

问题概述 使用 python 客户端 代码进行创建,【之前成功创建,但是现在出现报错,报错代码es_connection.client.indices.create】def create_vector_index(dataset_index_name,vector_query_field,query_field):es_connection = get_collention(dataset_index_name,vector_que…

Redis+Caffeine 太强了!二级缓存可以这样实现!

在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中,只有当缓存的访问没有命中时再查询数据库。 在一些场景下可能还需要进一步配合本地缓存使用,例如Guava cache或Caffeine,从而再次提升程序的响应…

Keil5 配置jlink及jlink下载程序,程序没有运行

1.先选好对应的芯片设备 之后步骤参考这个:MDK5 JLINK配置流程_keil5配置jlink仿真器步骤-CSDN博客 2.jlink下载程序之后板子没有运行可以查看reset and run是否有没有勾选

享元模式(Flyweight Pattern)

定义 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;其主要目的是通过共享尽可能多的数据来减少内存使用和提高性能。它通常在需要创建大量相似对象的情况下使用&#xff0c;以减少对象的数量和内存消耗。 示例 #include <iostream…