SQLite不为人知的事实
SQLite 是一款轻量级的嵌入式关系型数据库管理系统,具有以下特点和多方面的应用:
- 轻量级:SQLite 的库文件体积很小,非常适合在资源受限的环境中使用,比如移动设备、嵌入式系统等,它不需要单独的服务器进程,能直接嵌入到应用程序中运行。
- 零配置:安装和使用极为便捷,几乎不需要进行复杂的配置操作,只要将相应的库文件引入到项目中就可以开始使用,降低了使用门槛。
- 跨平台:可以在多种主流操作系统上运行,像 Windows、Linux、macOS、Android、iOS 等,方便开发者在不同平台开发应用时统一采用。
- 事务支持:具备强大的事务处理能力,能够保证数据操作的原子性、一致性、隔离性和持久性(ACID 特性),使得在复杂的数据更新场景下数据的完整性得以维护。
- 开源免费:其源代码是开源的,任何人都可以查看、修改和使用,并且可以免费用于商业和非商业项目中。
1. SQLite 是部署最广泛、使用最频繁的数据库。
SQLite 确实是全球范围内部署最广泛、使用最频繁的数据库之一,其受欢迎程度远超许多传统数据库。 目前有超过一万亿(10000000000000 个或一百万亿)个 SQLite 数据库正在使用中。 它由三个人维护。他们不允许外部贡献。
2. SQLite 的使用量可能比其他类型数据库的总和还要大。
世界上有数十亿份 SQLite 副本。它无处不在。
3.它也可能是部署最广泛的五大软件模块之一。
Hwaci 是 SQLite 背后的公司
4. SQLite 起源于一艘美国军舰。
D. Richard Hipp (DRH) 正在为海军驱逐舰 USS Oscar Austin 开发软件。那时软件在服务器出现故障时就会停止工作(这是在 2000 年代)。对于战舰来说,这是不可接受的。
因此 DRH 提出了一个问题:如果数据库无需任何服务器就能运行,会怎么样?用 DRH 的话来说:
我们为什么需要服务器?为什么我不能直接从磁盘驱动器上获取它?这样,如果计算机足够健康,它就可以运行我们的应用程序,我们没有可能失败并导致我们失败的依赖项,我环顾四周,没有可以做到这一点的 SQL 数据库引擎,和我一起工作的一个人说:“Richard,你为什么不写一个呢?” “好的,我试试看。”我没有马上这么做,但后来,资金中断了。那是在 2000 年,如果我没记错的话,纽特·金里奇和比尔·克林顿发生了某种争执,所以所有政府合同都被取消了,所以我失业了几个月,我想,“好吧,我现在就写那个数据库引擎。”
SQLite 没有使用传统的开源许可证
与大多数使用标准许可证(如 MIT 或 GPL)的开源项目不同,SQLite 没有使用传统的开源许可证,而是以 公共领域(Public Domain) 的形式发布。这种形式虽然符合开源的定义,但并未获得 Open Source Initiative (OSI) 的批准,因为 OSI 只批准基于其定义的标准许可证。
相反,SQLite 被发布到公共领域,并且限制更少。
SQLite不允许外部贡献
SQLite 的开发团队对代码质量有极高要求。 他们对每一行代码都进行严格的审查和测试,确保数据库的稳定性、性能和兼容性。 SQLite 不接受外部贡献是一个深思熟虑的决定,旨在确保代码库的质量、一致性和法律清晰性。 为了确保项目的可控性和长久维护,开发团队采取封闭式开发策略,集中精力保证代码的稳定性
您不能只发送拉取请求并希望补丁会被接受。
SQLite 对代码质量的极端重视
SQLite 中的每一行代码都有超过 600 行测试代码。测试覆盖库中的 100% 分支(和 100% MC/DC)。测试套件极其多样化,包括模糊测试、边界值测试、回归测试以及模拟操作系统崩溃、断电、I/O 错误和内存不足错误的测试。
SQLite 最初是作为Tcl 扩展开始的,其主要测试套件是用 Tcl 编写的。
SQLite 测试是专有的
有趣的是,一些 SQLite 测试是专有的。名为TH3 (Test Harness 3)的测试套件实现了代码的 100% 分支覆盖率,它是专有的,不对外开放。
我不知道有其他项目可以免费提供代码,但测试套件需要付费。
然而,他们连一本 TH3 都卖不出去。DRH 在播客中说道:
100% MCD 测试,即所谓的 TH3。这是专有的。我曾想过将这些测试出售给航空电子设备制造商,以此赚钱。但我们卖出的副本为零,所以这并没有真正奏效。
为了获得访问权限,人们需要成为 SQLite 联盟的一部分,每年的费用为 12 万美元。
SQLite有趣的商业模式
这是一个有趣的商业模式。他们通过许可证、付费支持、维护服务、联盟成员资格和商业扩展来创造收入。
SQLite 没有Code准则
SQLite 确实没有正式的 代码准则(Code of Conduct),但这并不妨碍它成为一个高度成功和可靠的开源项目. 而是源自《圣本笃规则》第 4 章“善行工具”的道德准则
SQLite 代替法律声明
在 SQLite 中:代替法律声明,这里有一个祝福:
所有源代码文件均附带祝福。
SQLite 速度非常快,可以与 相媲美fopen。
在某些用例中,您可以使用 SQLite 代替文件系统,这样可以快 35%。
SQLite 与 Redis (猜猜哪个更快?)
对于某些用例,由于网络堆栈和(反)序列化开销,SQLite 可能比 Redis 更快。
SQLite 具有单一写入模型。
与大多数数据库不同,您不能拥有多个并发写入器。
SQLite 的 单一写入模型意味着在任何时候,只有一个线程或进程能够对数据库进行写操作,而 多个线程或进程可以同时进行读操作。也就是说,SQLite 保证在任何时刻只有一个写操作是被允许的,而读取操作则不受限制。
2010 年,这一功能也通过添加 WAL 模式进行了更改。在此之前,您可以拥有读者或作者,但不能同时拥有两者。
SQLite 中却不常见的东西
还有一些在其他数据库中很常见但在 SQLite 中却不常见的东西:
- 默认为回滚日志模式,限制您拥有多个读取器或单个写入器
- 外键已禁用;它们是可选的
- 它是“弱类型”的。SQLite 称之为“类型亲和性”。这意味着即使您已经定义了类型,您也可以在列中插入任何内容。强类型列是可选的(通过STRICT表)。
- 其他数据库中的许多ALTER命令都不起作用。例如,您无法向现有列添加约束。(他们最近添加了重命名列名的功能) 这里有一整串的怪癖列表。
我讨厌它不强制类型。它完全是 YOLO(不严谨):
CREATE TABLE user(id INTEGER); INSERT into user VALUES (“YOLO!”); — This works! 不仅如此,如果您提供一些随机类型,它不会抛出任何错误。
CREATE TABLE t(value TIMMYSTAMP);
没有TIMMYSTAMP类型,但是 SQLite 很乐意接受它。
SQLite 有五种类型:NULL、INTEGER、REAL、TEXT、BLOB。想知道一些诅咒吗?类型亲和性通过子字符串匹配起作用!
CREATE TABLE t(value SPONGEBLOB) — This is BLOB type! 是的,这也会发生:
请注意,由于“POINT”末尾有“INT”,因此声明类型“FLOATING POINT”将赋予 INTEGER 亲和力,而不是 REAL 亲和力。
更改默认前缀从
这是我最喜欢的传说。当用户开始在半夜打电话给开发人员时,SQLite 不得不将默认前缀从 更改sqlite_为etilqs_
SQLite 非常重视向后兼容性
SQLite 版本 3 的所有发行版都可以读取和写入最早于 2004-06-18 发布的 SQLite 3 版本(版本 3.0.0)所创建的数据库文件。这就是“向后兼容”。开发人员承诺在 SQLite 3 的所有未来发行版中都保持数据库文件格式的向后兼容性。
但他们非常重视向后兼容性,即使他们发布了一个错误,他们也不会修复它
自己的版本控制系统
SQLite 的作者 D. Richard Hipp (DRH) 发现现有的版本控制系统并不适用。因此,他编写了自己的版本控制系统Fossil。当然,Fossil 是由 SQLite 提供支持的。
这让我想起了 Linus 编写 Git 的方式。
DRH 还编写了自己的解析器生成器,名为 Lemon。
飞机上对其进行了编码
DRH 根据 Donald Knuth 所著的《TAOCP》一书中的算法编写了 B-Tree,并在旅行途中在飞机上对其进行了编码(超级基础)
SQLite 的发音为“Ess-Cue-El-ite”。
不过,没有官方指南。DRH 在SQLite 论坛中提到:
我写了 SQLite,我认为它应该读作“SQL-ite”。像矿物一样。但我不介意你们随便怎么发音。
:-)