该页面重点介绍了SQLite的一些不寻常的特征,这些特征使SQLite与许多其他SQL数据库引擎有所不同。
零配置
使用SQLite之前不需要“安装”它。没有“设置”过程。没有需要启动,停止或配置的服务器进程。管理员无需创建新的数据库实例或为用户分配访问权限。SQLite不使用配置文件。无需通知系统SQLite正在运行。系统崩溃或电源故障后,无需采取任何措施即可恢复。没有要解决的问题。SQLite可以正常工作。
一旦熟悉它们,其他更熟悉的数据库引擎就会运行得很好。但是进行初始安装和配置可能非常复杂。
无服务器
(另请参见无服务器文档页面。)
大多数SQL数据库引擎都是作为单独的服务器进程实现的。想要访问数据库的程序使用某种进程间通信(通常是TCP / IP)与服务器通信,以将请求发送到服务器并接收回结果。SQLite无法以这种方式工作。使用SQLite,要访问数据库的进程直接从磁盘上的数据库文件读取和写入。没有中间服务器进程。
无服务器具有优点和缺点。主要优点是,没有安装,设置,配置,初始化,管理和故障排除的单独服务器进程。这就是SQLite是“零配置”数据库引擎的原因之一。使用SQLite的程序在运行之前不需要任何管理支持即可设置数据库引擎。任何能够访问磁盘的程序都可以使用SQLite数据库。
另一方面,使用服务器的数据库引擎可以为客户端应用程序中的错误提供更好的保护-客户端中的杂散指针不能破坏服务器上的内存。而且由于服务器是单个持久性进程,因此它能够更精确地控制数据库访问,从而实现更精细的粒度锁定和更好的并发性。
大多数SQL数据库引擎都是基于客户端/服务器的。在无服务器的那些中,SQLite是该作者唯一知道的一种,它允许多个应用程序同时访问同一数据库。
单个数据库文件
SQLite数据库是单个普通磁盘文件,可以位于目录层次结构中的任何位置。如果SQLite可以读取磁盘文件,则它可以读取数据库中的任何内容。如果磁盘文件及其目录可写,则SQLite可以更改数据库中的任何内容。数据库文件可以轻松地复制到USB记忆棒上或通过电子邮件发送以进行共享。其他SQL数据库引擎倾向于将数据存储为大量文件。这些文件通常位于只有数据库引擎本身可以访问的标准位置。这使数据更安全,但也使访问更加困难。某些SQL数据库引擎提供了直接写入磁盘并一起绕过文件系统的选项。这提供了附加的性能,但以相当大的设置和维护复杂性为代价。
稳定的跨平台数据库文件
SQLite文件格式是跨平台的。可以将写在一台计算机上的数据库文件复制到具有不同体系结构的另一台计算机上并在其上使用。大端或小端,32位或64位无关紧要。所有机器都使用相同的文件格式。此外,开发人员已保证保持文件格式稳定和向后兼容,因此,较新版本的SQLite可以读取和写入较旧的数据库文件。大多数其他SQL数据库引擎都要求您在从一个平台迁移到另一个平台时以及通常在升级到该软件的较新版本时转储和还原数据库。
袖珍的
如果对大小进行了优化,则启用了所有功能的整个SQLite库的大小都小于500KiB (在ix86上使用GNU编译器套件中的“ size”实用程序进行了测量。)可以在编译时禁用不需要的功能,以进一步减少如果需要,库的大小应小于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的过程中发挥了特殊的技巧,它们的长度可能千差万别。但是对于大多数表,如果您将一列声明为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,这些API允许用户添加新的 SQL函数 和整理序列。