Distinctive Features Of SQLite
Distinctive Features Of SQLite
本页重点介绍了SQLite的一些特性,这些特性是不寻常的,它使SQLite与许多其他SQL数据库引擎不同。
零配置
SQLite在使用之前不需要“安装”。没有“设置”程序。没有需要启动,停止或配置的服务器进程。无需管理员创建新的数据库实例或为用户分配访问权限。SQLite不使用配置文件。不需要做任何事情来告诉系统SQLite正在运行。系统崩溃或电源故障后无需执行任何操作即可恢复。没有什么可以排除故障。SQLite正常工作。其他更熟悉的数据库引擎运行良好,一旦你让他们去。但是执行初始安装和配置可能会非常复杂。
无服务器
大多数SQL数据库引擎是作为单独的服务器进程实现的。要访问数据库的程序使用某种进程间通信(通常为TCP / IP)与服务器通信,以向服务器发送请求并接收返回的结果。SQLite不能这样工作。使用SQLite,想要访问数据库的进程直接从磁盘上的数据库文件读取和写入数据。没有中间服务器进程。无服务器有优点和缺点。主要优点是没有单独的服务器进程来安装,设置,配置,初始化,管理和排除故障。这是SQLite是一个“零配置”数据库引擎的原因之一。使用SQLite的程序在运行之前不需要管理支持来设置数据库引擎。任何能够访问磁盘的程序都可以使用SQLite数据库。另一方面,使用服务器的数据库引擎可以更好地防止客户端应用程序中的错误 - 客户端中的杂散指针不会破坏服务器上的内存。而且由于服务器是一个持久性进程,因此可以更精确地控制数据库访问,从而实现更好的颗粒锁定和更好的并发性。大多数SQL数据库引擎都是基于客户/服务器的 在没有服务器的情况下,SQLite是这位作者唯一知道的允许多个应用程序同时访问同一个数据库的人。使用服务器的数据库引擎可以更好地保护客户端应用程序中的错误 - 客户端中的杂散指针不会损坏服务器上的内存。而且由于服务器是一个持久性进程,因此可以更精确地控制数据库访问,从而实现更好的颗粒锁定和更好的并发性。大多数SQL数据库引擎都是基于客户/服务器的 在没有服务器的情况下,SQLite是这位作者唯一知道的允许多个应用程序同时访问同一个数据库的人。使用服务器的数据库引擎可以更好地保护客户端应用程序中的错误 - 客户端中的杂散指针不会损坏服务器上的内存。而且由于服务器是一个持久性进程,因此可以更精确地控制数据库访问,从而实现更好的颗粒锁定和更好的并发性。大多数SQL数据库引擎都是基于客户/服务器的 在没有服务器的情况下,SQLite是这位作者唯一知道的允许多个应用程序同时访问同一个数据库的人。
单个数据库文件
SQLite数据库是一个单一的普通磁盘文件,可以位于目录层次结构中的任何位置。如果SQLite可以读取磁盘文件,那么它可以读取数据库中的任何内容。如果磁盘文件及其目录是可写的,则SQLite可以更改数据库中的任何内容。数据库文件可以很容易地复制到USB记忆棒上或通过电子邮件发送给共享。其他SQL数据库引擎倾向于将数据存储为大量文件集合。这些文件通常位于只有数据库引擎本身才能访问的标准位置。这使数据更安全,但也使访问更加困难。一些SQL数据库引擎提供了直接写入磁盘和绕过文件系统的选项。这提供了额外的性能,但代价是相当大的设置和维护复杂性。
稳定的跨平台数据库文件
SQLite文件格式是跨平台的。写在一台机器上的数据库文件可以复制到具有不同体系结构的不同机器上使用。大端或小端,32位或64位无关紧要。所有机器使用相同的文件格式。此外,开发人员已承诺保持文件格式稳定并向后兼容,因此较新版本的SQLite可以读取和写入较旧的数据库文件。大多数其他SQL数据库引擎要求您在从一个平台移动到另一个平台时转储和恢复数据库,并且通常在升级到较新版本的软件时。
简化
当针对大小进行优化时,整个SQLite库的大小都小于500KiB(使用GNU编译器套件中的“size”实用程序在ix86上测量)。可以在编译时禁用不需要的功能,以进一步减少如果需要,可将库的大小降至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和Python等动态类型编程语言结合使用时。
可变长度记录
大多数其他SQL数据库引擎为大多数表中的每行分配了固定数量的磁盘空间。他们玩特殊技巧来处理BLOB和CLOB,这些BLOB和CLOB的长度可能变化很大。但是对于大多数表格,如果你声明一个列是VARCHAR(100),那么数据库引擎将分配100字节的磁盘空间,而不管你实际存储在该列中的信息量有多少。相比之下,SQLite仅使用实际需要的磁盘空间量来存储信息。如果将单个字符存储在VARCHAR(100)列中,则只消耗一个字节的磁盘空间。(实际上是两个字节 - 每列开始处有一些开销来记录它的数据类型和长度。)SQLite使用可变长度记录具有许多优点。它显然会导致较小的数据库文件。它还使数据库运行得更快,因为移动和移出磁盘的信息较少。而且,使用可变长度的记录使得SQLite可以使用清单类型而不是静态类型。
可读的源代码
SQLite的源代码旨在为普通程序员提供可读性和可访问性。所有程序和数据结构以及许多自动变量都会被仔细评论,并提供有关他们所做工作的有用信息。样板评论被省略。
SQL语句编译成虚拟机代码
每个SQL数据库引擎都将每个SQL语句编译成某种内部数据结构,然后用它来执行语句的工作。但是在大多数SQL引擎中,内部数据结构是一个由相互关联的结构和对象组成的复杂网络。在SQLite中,编译的语句形式是一种类似于机器语言的简短程序。通过将EXPLAIN关键字添加到查询中,数据库的用户可以查看此虚拟机语言。在SQLite中使用虚拟机对图书馆的开发有很大的好处。虚拟机在SQLite的前端(解析SQL语句并生成虚拟机代码的部分)和后端(执行虚拟机代码并计算结果的部分)之间提供了一个清晰明确的连接。)虚拟机允许开发人员清楚地看到SQLite试图处理它编译的每条语句,这对调试有很大的帮助。根据编译的方式,SQLite还可以跟踪虚拟机的执行情况 - 在执行时打印每个虚拟机指令及其结果。
公共区域
SQLite的源代码处于公有领域。核心源代码的任何部分均不提供版权声明。(文档和测试代码是另一回事 - 文档和测试逻辑的某些部分由开源许可证管理。)SQLite核心软件的所有贡献者都已签署誓章,明确否认代码中的任何版权利益。这意味着任何人都可以通过SQLite源代码合法地完成他们想要的任何事情。还有其他带有自由许可的SQL数据库引擎,允许代码被广泛和自由地使用。但那些其他引擎仍受版权法管辖。SQLite的不同之处在于版权法根本不适用。其他SQL数据库引擎的源代码文件通常以描述您查看和复制该文件的合法权限的评论开始。SQLite源代码不包含任何许可证,因为它不受版权法管辖。SQLite源代码代替许可证提供了一个祝福:
愿你行善而不恶,
愿你为自己找到原谅,原谅别人,
愿你分享自由,永不止于你付出。
SQL语言扩展
SQLite提供了一些在其他数据库引擎中通常不能找到的SQL语言的增强功能。上面已经提到了EXPLAIN关键字和清单类型。SQLite还提供了诸如REPLACE和ON CONFLICT子句之类的语句,以允许增加对约束冲突解决方案的控制。SQLite支持ATTACH和DETACH命令,允许多个独立的数据库在同一个查询中一起使用。SQLite定义了API,允许用户添加新的SQL函数和整理序列。
SQLite在公共领域。