SQLite3 打败了 PostgreSQL ——世界最大装机量数据库,低调但不小众
https://www.sqlite.org/src/taglist
📅 软件版本发布与操作系统版本推测表
| major-release | 2025-11-04 | ||||||
| version-3.51.0 | 2025-11-04 | ||||||
| version-3.42.1 | 2025-08-06 | ||||||
| version-3.44.5 | 2025-07-24 | ||||||
| version-3.50.4 | 2025-07-30 | ||||||
| version-3.50.3 | 2025-07-17 | ||||||
| version-3.50.2 | 2025-06-28 | ||||||
| version-3.50.1 | 2025-06-06 | ||||||
| version-3.50.0 | 2025-05-29 | ||||||
| version-3.49.2 | 2025-05-07 | ||||||
| patch-release | 2025-02-19 | ||||||
| version-3.49.1 | 2025-02-18 | ||||||
| version-3.49.0 | 2025-02-06 | ||||||
| version-3.48.0 | 2025-01-14 | ||||||
| version-3.47.2 | 2024-12-07 | ||||||
| version-3.47.1 | 2024-11-25 | ||||||
| version-3.47.0 | 2024-10-21 | ||||||
| version-3.46.1 | 2024-08-13 | ||||||
| version-3.46.0 | 2024-05-23 | ||||||
| version-3.45.3 | 2024-04-15 | ||||||
| version-3.44.3 | 2024-04-05 | ||||||
| version-3.45.2 | 2024-03-12 | ||||||
| version-3.45.1 | 2024-01-30 | ||||||
| version-3.45.0 | 2024-01-15 | ||||||
| version-3.44.2 | 2023-11-24 | ||||||
| version-3.44.1 | 2023-11-22 | ||||||
| version-3.44.0 | 2023-11-01 | ||||||
| version-3.43.2 | 2023-10-10 | ||||||
| version-3.43.1 | 2023-09-11 | ||||||
| version-3.43.0 | 2023-08-24 | ||||||
| version-3.42.0 | 2023-05-16 | ||||||
| version-3.41.2 | 2023-03-22 | ||||||
| version-3.41.1 | 2023-03-10 | ||||||
| version-3.41.0 | 2023-02-21 | ||||||
| version-3.40.1 | 2022-12-28 | ||||||
| version-3.40.0 | 2022-11-16 | ||||||
| version-3.39.4 | 2022-09-29 | ||||||
| version-3.39.3 | 2022-09-05 | ||||||
| version-3.39.2 | 2022-07-21 | ||||||
| version-3.39.1 | 2022-07-13 | ||||||
| version-3.39.0 | 2022-06-25 | ||||||
| version-3.38.5 | 2022-05-06 | ||||||
| version-3.38.4 | 2022-05-04 | ||||||
| version-3.38.3 | 2022-04-27 | ||||||
| version-3.38.2 | 2022-03-26 | ||||||
| version-3.38.1 | 2022-03-12 | ||||||
| version-3.38.0 | 2022-02-22 | ||||||
| version-3.37.2 | 2022-01-06 | ||||||
| version-3.37.1 | 2021-12-30 | ||||||
| version-3.37.0 | 2021-11-27 | ||||||
| version-3.36.0 | 2021-06-18 | ||||||
| version-3.35.5 | 2021-04-19 | ||||||
| version-3.35.0 | 2021-03-12 | ||||||
| version-3.34.1 | 2021-01-20 | ||||||
| version-3.34.0 | 2020-12-01 | ||||||
| version-3.33.0 | 2020-08-14 | ||||||
| version-3.32.0 | 2020-05-22 | ||||||
| version-3.31.0 | 2020-01-22 | ||||||
| version-3.30.0 | 2019-10-04 | ||||||
| version-3.29.0 | 2019-07-10 | ||||||
| version-3.28.0 | 2019-04-16 | ||||||
| version-3.27.0 | 2019-02-07 | ||||||
| version-3.26.0 | 2018-12-01 | ||||||
| version-3.25.0 | 2018-09-15 | ||||||
| version-3.24.0 | 2018-06-04 | ||||||
| version-3.23.0 | 2018-04-02 | ||||||
| version-3.22.0 | 2018-01-22 | ||||||
| version-3.21.0 | 2017-10-24 | ||||||
| version-3.20.0 | 2017-08-01 | ||||||
| version-3.19.0 | 2017-05-22 | ||||||
| version-3.18.0 | 2017-03-28 | ||||||
| version-3.17.0 | 2017-02-13 | ||||||
| version-3.16.0 | 2017-01-02 |
| 3.0 (2004) | |||
| 3.6.x (2008) | |||
| 3.7.x (2010) | |||
| 3.8.x (2013) | |||
| 3.9~3.15 (2015–2016) | |||
| 3.24+ (2018) | |||
| 3.33+ (2020) | |||
| 3.39+ (2022) | |||
| 3.45+ (2024) |
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
echo'#ifndef USE_SYSTEM_SQLITE' >tclsqlite3.c
cat sqlite3.c >>tclsqlite3.c
echo'#endif /* USE_SYSTEM_SQLITE */' >>tclsqlite3.c
cat /data/sqllite345/src/tclsqlite.c >>tclsqlite3.c
tclsh8.6 /data/sqllite345/tool/buildtclext.tcl --destdir "" --cc "gcc" -g -O2 -DSQLITE_OS_UNIX=1 -DSQLITE_ENABLE_MATH_FUNCTIONS
can't read "@": no such variable
while executing
"subst $cmd"
invoked from within
"if {$tcl_platform(platform)=="windows"} {
# We are only able to install, uninstall, and list on Windows.
# The build process is handled by the Mak..."
(file "/data/sqllite345/tool/buildtclext.tcl" line 69)
make: *** [Makefile:1603: tclextension-install] Error 1
编译时./configure --disable-tcl 去掉tcl测试环境,在进行make make install就可以了,版本3.45 Rocky linux 8.10
#!/bin/bash
for i in {1..50}; do
whiletrue; do
sqlite3 /data/data/test.db < /data/data/writer.sql
done &
done
# 50 并发查询
for i in {1..50}; do
whiletrue; do
sqlite3 /data/data/test.db < /data/data/reader.sql
done &
done
SELECT count(*)
FROM test_data
WHERE value > (abs(random() % 50000));
BEGIN TRANSACTION;
INSERT INTO test_data (name, value)
VALUES ('writer_' || random(), abs(random() % 100000));
COMMIT;
| 运行模式 | ||
| 进程模型 | postmaster | |
| 部署方式 | ||
| 依赖 | ||
| 典型使用场景 |
而从一个合格的移动端的数据库来说,系统资源的占用是一个关键,你的应用产品需要部署到各个地方,可能是台式,笔记本,PAD,手机,或者智能硬件上,所以SQLite更有能力这里我们做一个环境上的总结。
| 连接启动 | ||
| 首次查询延迟 | ||
| 并发访问 | ||
| 断电恢复 |
接下来咱们继续学习SQLite,我们对一些简单的SQLite的命令进行简单的学习。
SQLite 作为轻量级的数据库,其数据库类型体系与传统的数据类型差异是很签注的额,从数据库类型上看,他的主要核心是围绕动态类型,和兼容类型他的数据类型并不精准,而是围绕灵活性而来。
SQLite的第一个区别就是动态类型,比如我们PostgreSQL中INT,我们只能存储数据类型,而SQLite不是的,即使你声明的表类型是INT,他也可以存储字符串类型,浮点等,列定义仅仅作为参考,不做强制。
后面在SQLite中又有strict表,这类表才是严格和传统数据库类型强制一致的表,如果有此类需求需要建表的时候建立strict表。
SQlite的数据类型主要有五种,NULL, INTEGER ,REAL, TEXT, BLOB 等,这里SQLite里面是没有时间类型的,时间类型需要转化,通过date, strftime函数来进行。
日期时间类型:无独立存储类,需通过以下 3 种格式存储,再用内置日期函数(如 date()、strftime())转换:
TEXT:ISO8601 格式(如 2024-11-14 12:00:00); REAL:儒略日(自公元前 4714 年 11 月 24 日格林威治正午起的天数); INTEGER:Unix 时间戳(自 1970-01-01 00:00:00 UTC 起的秒数)
这里需要注意如果建立不同表,那么你输入的类型如果是5.0 会自动转化为 5整型,而不是浮点类型 real。
可能是随着SQLite使用的越来越多,作为移动端的数据越来越重要,那种数据库把你的数据类型转错的情况就发生了,所以后续的SQLite有新的一个表类型strict,建立表需要建表的末尾添加strict 也就是严格模式。
列类型强制要求
所有列必须显式指定类型,不能省略; 仅允许 6 种类型:INT、INTEGER、REAL(浮点)、TEXT(字符串)、BLOB(二进制)、ANY(任意类型),无其他可选类型(未来可能新增)。
(2)数据插入规则
非ANY类型列:插入数据需是NULL(无NOT NULL约束时)或匹配列类型;SQLite 会按 “类型亲和性规则” 尝试转换(与其他数据库一致),无法无损转换则抛出SQLITE_CONSTRAINT_DATATYPE错误(例:INTEGER列插入'xyz'会报错)。 ANY类型列:可接受任意类型数据(NOT NULL约束时拒绝NULL),不做任何类型转换,完全保留原始数据类型与值。
(3)主键与完整性检查
主键列隐式包含NOT NULL约束;但INTEGER PRIMARY KEY列插入NULL时,会自动转为唯一整数(与非严格表规则一致)。 PRAGMA integrity_check/quick_check命令会检查 STRICT 表的列类型,异常时提示错误。
(4)与非严格表的共性 除上述差异外,STRICT 表的其他特性与普通表完全一致,包括:CHECK/NOT NULL/FOREIGN KEY/UNIQUE约束、DEFAULT/COLLATE子句、生成列、ON CONFLICT处理、索引、AUTOINCREMENT、INTEGER PRIMARY KEY作为rowid别名、磁盘存储格式等。
ANY 数据类型:特殊规则 设计目的:在严格模式下,仍支持 “单列存储任意类型数据” 的灵活能力(SQLite 独有特性)。
STRICT 表 vs 非严格表的差异: STRICT 表的ANY列:完全保留原始数据(例:插入'000123',存储为text类型的'000123'); 非严格表的ANY列:会尝试将 “类数字字符串” 转为数值(例:插入'000123',存储为integer类型的123)。
向后兼容性
(1)版本限制 仅 SQLite 3.37.0 及以上版本能识别STRICT关键字;低版本打开含STRICT表的数据库时,默认报错(除特殊情况外)。 不含STRICT表的数据库,3.37.0 及以上版本创建后,仍可被低至 3.0.0(2004 年)的版本读写。
(2)低版本访问 STRICT 表的特殊方式 低版本可通过打开数据库后立即执行PRAGMA writable_schema=ON(关闭 schema 解析错误),忽略STRICT关键字并读写表,但不会触发严格类型检查(可能导致数据类型错误,需用高版本PRAGMA quick_check检测)。 SQLite CLI 的.dump命令默认启用writable_schema=ON,低版本用.dump可读写 STRICT 表,但同样存在数据损坏风险。
其他表选项 CREATE TABLE语句末尾(闭合括号后)可接逗号分隔的表选项,目前仅支持 2 种: STRICT(严格类型)、WITHOUT ROWID(无rowid表); 选项顺序不限,当前版本允许重复选项(未来可能取消,不建议依赖)。
所以针对业务,希望开发人员在3.37版本后的SQLite应该这对业务中的一些精确的数字,或者数字就是文字的部分应该严格,建表就要建立一个严格的表。
CREATE TABLE orders (order_id INTEGER PRIMARY KEY,order_no TEXT NOT NULL UNIQUE,customer_id INTEGER NOT NULL,amount REAL NOT NULL,pay_type TEXT CHECK(pay_type IN ('CARD','CASH','WALLET')),created_at TEXT NOT NULL,raw_payload ANY,note TEXT,FOREIGN KEY (customer_id) REFERENCES customers(id)) STRICT;
SQLite 并不需要启动,你可以认为他是一个程序,通过SQLite 数据库文件名,就可以进入到数据库进行操作。
查看系统的版本 sqlite> .version SQLite 3.47.1 2024-11-25 12:07:48 b95d11e958643b969c47a8e5857f3793b9e69700b8f1469371386369a26e577e zlib version 1.2.11 gcc-8.5.0 20210514 (Red Hat 8.5.0-28) (64-bit) sqlite>
对Sqlite的日常命令不熟悉,可以通过.help进行更详细的命令的问询
对sqlite中的有多少表进行询问
查看有多少表使用 .table .schema 表名 查看表结构
sqlite>
sqlite> .tables
id test_data
sqlite> .schema test_data
CREATE TABLE test_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
value INTEGER,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
sqlite>
sqlite> select * from sqlite_master;
table|id|id|2|CREATE TABLE id (id int)
table|sqlite_sequence|sqlite_sequence|4|CREATE TABLE sqlite_sequence(name,seq)
table|test_data|test_data|3|CREATE TABLE test_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
value INTEGER,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
Run Time: real 0.000 user 0.000020 sys 0.000039
具体我们查看表名前缀为test的表遇到此问题,目前最快速的方案是,退出SQLite然后在进入进行命令的操作。
总结: SQLite在我使用中,经常有database lock的错误产生,(因为我还是用传统数据库思维去操作的问题),解决也很简单,查杀链接,或把.quit数据库即可,解决库锁的问题。在操作中命令不支持上下箭头来进行历史命令的查找,建表要注意宽松模式和严苛模式,其实我逐步对SQLite的深入,我其实对他有很多的问题。
1 SQLLite数据支持数据压缩吗,因为我现在一个表,几百万的数据就270MB的文件大小了,说明这个数据库本身数据的文件的控制有问题,应该有可以进行碎片整理的命令,这个我看到了,但我还没有深入。
2 在研发中,使用SQLite3 如何进行开发和库表的使用,用传统数据库使用思路是一定不行的,还需要打破原有的设计思路来避免库锁的问题。
3 因为我曾经有一次服务器重启,然后进入SQLite特别慢的经历,说明断电对第一次SQLite启动是有阻碍的,应该是wal模式下数据在重做导致的,但是一个关键的问题,SQLite 没有日志,没有错误的报告等等,这些还需要研究。
眼见它起高楼,眼见高楼塌,Oracle裁撤MySQL团队,社区版危矣!
消失的数据库巨头,如今只剩3家活着!
给每种语言 1GB 内存,看看谁先死 !
《AI数据分析之ChatBI发展与应用实践》白皮书(附下载)正式上线啦
Linux 一键巡检脚本,建议收藏!
MySQL要坐不住了!Vitess之父Sugu“投敌”Postgres造新数据库,这次真要掀翻桌子?
为什么DeepSeek火之后,人们想到的是大量裁员,而不是实行上三休四?
苹果“痛下杀手”弃Java,用自家语言Swift重写关键服务:内存减90%,性能增40%!
号外!《核心系统分布式数据库选型指南》电子书(附下载)正式上线
解锁数据架构现代化密码,《实时数仓选型指南》电子书(附下载)正式上线啦