关于SQLite的疯狂和有趣的事实的集合
<time class="post-date" datetime="2024-12-30 15:23:57 +0530" data-immersive-translate-walked="1fc84c77-91bc-4cf5-a722-f2319a65a864" data-immersive-translate-paragraph="1" style="box-sizing: border-box; display: block; margin: 0px 0px 1rem; text-align: right;">2024年12月30日</time></header>
-
SQLite是部署最多、使用最多的数据库。有超过一万亿(100000000000000或100万)的SQLite数据库正在积极使用。
它由三个人维护。他们不允许外部捐款。
-
SQLite的使用可能比所有其他数据库引擎的总和更多。数十亿个SQLite副本存在于野外。它无处不在。
[图片上传失败...(image-db69a5-1736577160724)]
-
它也可能是部署最多的五大软件模块之一。
[图片上传失败...(image-7e3244-1736577160724)]
-
Hwaci是SQLite背后的公司。他们也喜欢音乐(?)
[图片上传失败...(image-dd3c31-1736577160724)]
-
SQLite起源于一艘美国军舰。D.Richard Hipp(DRH)正在为海军驱逐舰奥斯卡·奥斯汀号构建软件。每当服务器停机时,现有软件就会停止工作(这是在2000年代)。对于一艘战舰来说,这是不可接受的。
所以DRH问了一个问题:如果数据库在没有任何服务器的情况下工作怎么办?用DRH的话来说:
为什么我们甚至需要一个服务器?为什么我不能直接把这个从磁盘驱动器上拉下来?这样,如果计算机足够健康,它就可以运行我们的应用程序,我们没有可以失败并导致我们失败的依赖项,我环顾四周,没有SQL数据库引擎可以做到这一点,和我一起工作的一个人说:“Richard,你为什么不写一个呢?”“好的,我会试一试的。”我没有马上那样做,但后来,资金中断了。这是在2000年,如果我没记错的话,Newt Gingrich和Bill Clinton正在打架,所以所有政府合同都被关闭了,所以我休息了几个月,我想,“好吧,我现在就写那个数据库引擎。”
-
与大多数使用标准许可证(如麻省理工学院或GPL)的开源项目不同,SQLite没有OSI批准的许可证。
[图片上传失败...(image-10fd3c-1736577160724)]
相反,SQLite被释放到公共领域,它的限制更少。
-
他们不允许外部捐款。您不能只是发送拉取请求,并希望补丁被接受。
[图片上传失败...(image-31c7eb-1736577160724)]
-
开源,而不是开放贡献
[图片上传失败...(image-40dc5e-1736577160724)]
为SQLite做出贡献是仅限邀请的(我没有来源)。只有在您被邀请并签署一份宣誓书,将您的贡献奉献给公共领域后,您才能提交补丁。
-
他们是怎么做饭的?
SQLite中每行代码都有600多行测试代码。测试涵盖了图书馆中100%的分支(和100%的MC/DC)。测试套件非常多样化,包括模糊测试、边界值测试、回归测试以及模拟操作系统崩溃、功耗、I/O错误和内存丢失错误的测试。
SQLite最初是Tcl扩展,其主要测试套件是用Tcl编写的。
有趣的是,一些SQLite测试是专有的。名为TH3(测试线束3)的测试套件实现了代码的100%分支覆盖,是专有的,不开放访问。
我不知道任何其他项目让代码免费,但测试套件是付费的。
然而,他们无法出售TH3的一份副本。DRH在播客中说:
> 100%的MCD测试,称为TH3。那是专有的。我的想法是,我们将把这些测试卖给航空电子制造商,并以这种方式赚钱。我们卖的副本正好为零,所以这并没有真正奏效。
为了获得访问权限,一个人需要成为SQLite联盟的一员,该联盟每年花费12万美元。
这是一个有趣的商业模式。他们通过许可证、付费支持、维护服务、财团会员资格和商业扩展来创造收入。
SQLite没有行为准则(CoC),而是道德准则来自《圣规则》第4章的“善行工具”。本尼迪克特
[图片上传失败...(image-4627e2-1736577160724)]
- 在SQLite中:这里有一个祝福,代替法律声明:
[图片上传失败...(image-772185-1736577160724)]
所有源代码文件都带有祝福。
- SQLite太快了,它们与
fopen
竞争。对于某些用例,您可以使用SQLite而不是文件系统,这可以加快35%的速度。
[图片上传失败...(image-a5382a-1736577160724)]
- SQLite vs Redis(猜哪个更快?)
[图片上传失败...(image-230d2-1736577160724)]
对于[某些用例](https://x.com/iavins/status/1849422515027763227),由于网络堆栈和(去)序列化开销,SQLite可能比Redis更快。
- 但是,与大多数数据库不同,SQLite有一个单一的写入模型。你不能同时拥有多个作家。
最近在2010年通过添加WAL模式也发生了变化。在此之前,你可以有读者或作家,但永远不会在一起。
- 还有其他东西在其他数据库中非常常见,但在SQLite中并不常见:
* 默认值是回滚日志模式,它限制您拥有多个读者或单个作家
* 外键被禁用;它们是选择加入的
* 它是“弱类型”。SQLite称它为“类型亲和力”。这意味着,即使您已经定义了类型,您也可以在列中插入任何东西。强类型列是选择加入的(通过[`STRICT`](https://www.sqlite.org/stricttables.html)表)。
* [](https://sqlite.org/omitted.html)您期望在其他数据库中[的许多`ALTER`命令](https://sqlite.org/omitted.html)不起作用。例如,您不能向现有列添加约束。(他们最近增加了重命名列名的功能)
这里有一整套[怪癖清单](https://www.sqlite.org/quirks.html)。
- 我讨厌它不强制执行类型。这完全是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`。想知道一些被诅咒的东西吗?类型亲和力通过[子字符串匹配](https://www.sqlite.org/datatype3.html#determination_of_column_affinity)来工作!
```
CREATE TABLE t(value SPONGEBLOB) --- This is BLOB type!
```
所以,是的,这也发生了:
> 请注意,由于“POINT”末尾的“INT”,声明的“浮点”类型将给出整数亲和力,而不是真实亲和力。
- 这是我最喜欢的传说之一。当用户在半夜开始呼叫开发人员时,SQLite必须将默认前缀从
sqlite_
更改为etilqs_
[图片上传失败...(image-bb4899-1736577160724)]
- SQLite非常重视向后兼容性
> SQLite版本3的所有版本都可以读取和写入第一个SQLite 3版本(版本3.0.0)创建的数据库文件,可以追溯到2004年6月18日。这就是“向后兼容性”。开发人员承诺为SQLite 3的所有未来版本保持数据库文件格式的向后兼容性。
- 但他们非常重视向后兼容性,即使他们已经发货了错误,他们也不会修复它
[图片上传失败...(image-fa8a8d-1736577160724)]
- SQLite的作者D。Richard Hipp(DRH)发现现有的版本控制系统不合适。所以他写了自己的名为Fossil。当然,Fossil由SQLite提供支持。
这让我想起了Linus是如何编写Git的。
DRH还编写了自己的名为Lemon的解析器生成器。
DRH根据Donald Knuth的《TAOCP》一书中的算法编写了B-Tree,在旅行时在飞机上编码(基于超级)
SQLite的发音是“Ess-Cue-El-ite”。不过,没有官方指导方针。SQLite论坛中提到的DRH:
> 我写了SQLite,我认为它应该发音为“S-Q-L-ite”。像矿物一样。但我不介意你们想用什么方式说。
>
> :-)