赞
踩
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 更快。
SQLite 不能直接与客户端/服务器 SQL 数据库引擎相提并论,例如 作为 MySQL、Oracle、PostgreSQL 或 SQL Server,因为 SQLite 正在尝试 解决不同的问题。
客户端/服务器 SQL 数据库引擎努力实现共享存储库 的企业数据。他们强调可扩展性、并发性、中心化、 和控制。 SQLite致力于为以下对象提供本地数据存储 单独的应用程序和设备。SQLite强调经济性, 高效、可靠、独立和简单。
SQLite不与客户端/服务器数据库竞争。 SQLite 与 fopen() 竞争。
由于 SQLite 数据库不需要管理, 它适用于必须在没有专家人工支持的情况下运行的设备。 SQLite 非常适合用于 手机、机顶盒、电视机、游戏机、 相机、手表、厨房电器、恒温器、汽车、 机床、飞机、遥感器、无人机、医疗设备、 和机器人:“物联网”。
客户机/服务器数据库引擎被设计为驻留在网络核心的一个受人喜爱的数据中心内。SQLite也在那里工作,但SQLite也在网络边缘蓬勃发展,在为应用程序提供快速可靠的数据服务的同时,为那些连接不可靠的应用程序提供了自己的服务。
SQLite 通常用作磁盘上的文件格式 对于版本控制系统等桌面应用程序, 财务分析工具、媒体编目和编辑套件、CAD 包、记录保存程序等。传统的 File/Open 操作调用 sqlite3_open() 以附加到数据库 文件。修订应用程序内容时会自动进行更新 因此,“文件/保存”菜单选项变得多余。文件/Save_As menu 选项可以使用备份 API 实现。
这种方法有很多好处,包括改进 性能,降低成本和复杂性,以及 提高可靠性。
SQLite在使用之前不需要“安装”。 没有“设置”程序。没有 需要启动、停止或配置的服务器进程。 有 管理员无需创建新的数据库实例或分配 用户的访问权限。 SQLite不使用配置文件。 无需执行任何操作即可告诉系统 SQLite 正在运行。 在系统崩溃或电源故障后,无需执行任何操作即可恢复。 无需进行任何故障排除。
SQLite只是工作。
其他更熟悉的数据库引擎一旦启动,就会运行良好。 但是进行初始安装和配置可以 令人生畏的复杂。
(另请参阅无服务器文档页面。
大多数 SQL 数据库引擎都是作为单独的服务器实现的 过程。想要访问数据库的程序进行通信 与服务器使用某种进程间通信 (通常为 TCP/IP)向服务器发送请求并接收 返回结果。SQLite不是这样工作的。使用 SQLite, 想要访问数据库的进程读取和写入 直接从磁盘上的数据库文件。没有中介 服务器进程。
无服务器有优点也有缺点。这 主要优点是没有单独的服务器进程 安装、设置、配置、初始化、管理和故障排除。 这就是为什么SQLite是“零配置”数据库的原因之一 发动机。使用 SQLite 的程序不需要管理支持 用于在运行数据库引擎之前设置它们。任何程序 能够访问磁盘的,能够使用 SQLite 数据库。
另一方面,使用服务器的数据库引擎可以提供 更好地防止客户端应用程序中的错误 - 杂散指针 在客户端中,无法损坏服务器上的内存。而且因为服务器 是一个单一的持久性进程,它能够控制数据库访问 更高的精度,允许更精细的粒度锁定和更好的并发性。
大多数 SQL 数据库引擎都是基于客户端/服务器的。在那些 无服务器,SQLite 是笔者唯一知道的 允许多个应用程序同时访问同一数据库。
SQLite数据库是一个普通的磁盘文件,可以定位 目录层次结构中的任意位置。如果SQLite可以读取 磁盘文件,然后它可以读取数据库中的任何内容。如果磁盘 文件及其目录是可写的,那么SQLite可以更改任何内容 在数据库中。数据库文件可以很容易地复制到USB上 记忆棒或通过电子邮件发送以供共享。
其他 SQL 数据库引擎倾向于将数据存储为大量 文件。通常,这些文件位于标准位置,只有 数据库引擎本身可以访问。这使得数据更加安全, 但也使它更难访问。某些 SQL 数据库引擎提供 直接写入磁盘并绕过文件系统的选项 完全。这提供了额外的性能,但代价是 相当大的设置和维护复杂性。
SQLite 文件格式是跨平台的。写入的数据库文件 在一台计算机上可以复制到另一台计算机上并使用 不同的架构。Big-endian 或 little-endian,32 位或 64 位无关紧要。所有计算机都使用相同的文件格式。 此外,开发人员已承诺保留文件格式 稳定且向后兼容,因此较新版本的 SQLite 可以 读取和写入较旧的数据库文件。
大多数其他 SQL 数据库引擎都要求您转储和还原 从一个平台移动到另一个平台时的数据库,并且经常 升级到较新版本的软件时。
当针对大小进行优化时,整个 SQLite 库将启用所有内容 大小小于 500KiB(在 ix86 上使用“大小”测量 GNU 编译器套件中的实用程序。可以禁用不需要的功能 在编译时,将库的大小进一步减小到 如果需要,300KiB。
大多数其他 SQL 数据库引擎都比这大得多。IBM 引以为豪 其最近发布的 CloudScape 数据库引擎“仅”为 2MiB jar 文件 - 比 SQLite 大一个数量级,即使它是 压缩! Firebird 吹嘘其客户端库只有 350KiB。那是 和 SQLite 一样大,甚至不包含数据库引擎。 Oracle 的 Berkeley DB 库是 450KiB,它省略了 SQL 支持,仅为程序员提供简单的键/值对。
大多数 SQL 数据库引擎都使用静态类型。数据类型已关联 表中的每一列,并且仅包含该特定数据类型的值 允许存储在该列中。SQLite放宽了此限制 通过使用清单类型。 在清单类型中,数据类型是值本身的属性,而不是 存储值的列。 因此,SQLite允许用户存储 任何数据类型的任何值放入任何列中,而不管声明的类型如何 该列。(此规则有一些例外:INTEGER PRIMARY KEY 列只能存储整数。SQLite试图胁迫 值转换为列的声明数据类型(如果可以)。
据我们所知,SQL 语言规范允许使用 清单类型。尽管如此,大多数其他 SQL 数据库引擎都是 静态类型,所以有些人 觉得使用清单类型是SQLite中的一个错误。但是作者 的SQLite非常强烈地认为这是一个功能。清单的使用 在SQLite中键入是一个经过深思熟虑的设计决策,已在实践中得到证明 使 SQLite 更可靠、更易于使用,尤其是在用于 与动态类型编程语言(如 Tcl 和 蟒。
大多数其他 SQL 数据库引擎都分配了固定数量的磁盘空间 对于大多数表中的每一行。他们玩特殊的处理技巧 BLOB 和 CLOB,它们的长度可能千差万别。但对于大多数人来说 表,如果将一列声明为 VARCHAR(100),则数据库 引擎将分配 100 字节的磁盘空间,无论您实际有多少信息 存储在该列中。
相比之下,SQLite仅使用实际的磁盘空间量 需要将信息存储在一行中。如果您存储单个 字符,则只有磁盘的一个字节 空间被占用。(实际上是两个字节 - 有一些开销 每列的开头,以记录其数据类型和长度。
SQLite 使用可变长度记录具有许多优点。 显然,它会导致更小的数据库文件。它还使 数据库运行速度更快,因为要移入和移出的信息更少 磁盘。而且,使用可变长度记录可以 SQLite 采用清单类型而不是静态类型。
SQLite的源代码被设计为可读和可访问的 普通的程序员。所有过程和数据结构以及许多 自动变量被仔细注释,并带有以下有用的信息 他们做什么。省略了样板注释。
每个 SQL 数据库引擎都会将每个 SQL 语句编译为某种 内部数据结构,然后用于执行 陈述。但是在大多数 SQL 引擎中,内部数据结构是 由相互关联的结构和对象组成的复杂网络。在 SQLite 中,编译的 语句形式是机器语言中的简短程序,例如 表示法。数据库的用户可以通过在前面加上 EXPLAIN 关键字来查看此虚拟机语言 添加到查询中。
在SQLite中使用虚拟机对 图书馆的发展。虚拟机提供清晰、定义明确的 SQLite前端(解析SQL的部分)之间的交汇点 语句并生成虚拟机代码)和后端( 执行虚拟机代码并计算结果的部分。 虚拟机允许开发人员清楚地看到,并在 易于阅读的 SQLite 尝试对每个语句执行的操作 它可以编译,这对调试有很大的帮助。 根据它的编译方式,SQLite 还具有以下功能: 跟踪虚拟机的执行 - 打印每个 虚拟机指令及其执行时的结果。
SQLite 为 SQL 语言提供了许多增强功能 在其他数据库引擎中通常找不到。 前面已经提到了 EXPLAIN 关键字和清单类型 以上。SQLite 还提供诸如 REPLACE 和 ON CONFLICT 子句之类的语句,这些语句允许 添加了对解决约束冲突的控制。 SQLite 支持允许多个 ATTACH 和 DETACH 命令 在同一查询中一起使用的独立数据库。 SQLite定义了API,允许用户添加新的SQL函数和整理序列。
每当将 SQLite 与其他 SQL 数据库引擎进行比较时,例如 SQL Server、PostgreSQL、MySQL 或 Oracle,首先很重要 意识到SQLite并非旨在替代或竞争对手 这些系统中的任何一个。SQLite 是无服务器的。没有单独的 管理数据库的服务器进程。应用程序交互 使用数据库引擎使用函数调用,而不是通过发送消息 到单独的进程或线程。
事实上,SQLite是嵌入式和无服务器的,而不是 客户端/服务器是一个功能,而不是一个错误。
客户端/服务器数据库,如 MySQL、PostgreSQL、SQL Server、Oracle 和 其他的则是现代系统的重要组成部分。 这些系统解决了一个重要问题。 但是SQLite解决了一个不同的问题。 SQLite 和客户端/服务器数据库都有其作用。 将 SQLite 与其他 SQL 数据库引擎进行比较的开发人员需要 以清楚地理解这种区别。
SQLite在数据类型方面是灵活的。数据类型是建议性的 而不是强制性的。
一些评论家说SQLite是“弱类型”,而其他 SQL 数据库是“强类型”的。我们认为这些条款是 不准确,甚至贬义。我们更愿意说SQLite是 “灵活类型”,其他 SQL 数据库引擎是 “刚性类型”。
与大多数其他 SQL 实现不同, SQLite 没有单独的 BOOLEAN 数据类型。 相反,TRUE 和 FALSE (通常)表示为整数 1 和 0, 分别。 这似乎不会造成很多问题,因为我们很少收到投诉 关于它。但重要的是要认识到这一点。
从 SQLite 版本 3.23.0 (2018-04-02) 开始,SQLite 还 将 TRUE 和 FALSE 关键字识别为整数值 1 和 0 的别名, 分别。 这提供了与其他 SQL 实现的更好兼容性。 但为了向后兼容,如果有名为 TRUE 或 FALSE,则这些关键字将被视为引用这些关键字的标识符 列,而不是布尔文本。
SQLite 没有 DATETIME 数据类型。 相反,可以通过以下任何一种方式存储日期和时间:
作为 ISO-8601 格式的 TEXT 字符串。示例:“2018-04-02 12:13:46”。
作为自 1970 年以来的整数秒数(也称为“unix 时间”)。
因为SQLite在数据类型方面是灵活和宽容的, 可以创建完全没有指定数据类型的表列。 例如:
CREATE TABLE t1(a,b,c,d);
表“t1”有四列“a”、“b”、“c”和“d”,它们具有 未分配特定数据类型。你可以存储任何你想要的东西 这些列中的任何一个。
SQLite 表示以下查询返回 false:
SELECT 1='1';
它之所以这样做,是因为整数不是字符串。 其他所有主要的 SQL 数据库引擎都说这是真的,这是有原因的 SQLite的创建者不明白。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。