SQLite介绍
# 简介
C 语言编写的开源、轻量级、快速、独立且高可靠性的 SQL 数据库引擎,它提供了功能齐全的数据库解决方案,QLite 几乎可以在所有的手机和计算机上运行,它被嵌入到无数人每天都在使用的众多应用程序中,SQLite 还具有稳定的文件格式、跨平台能力和向后兼容性等特点。SQLite 通常用于为个人应用程序和设备提供本地数据存储,它强调的是经济、高效、可靠、独立和简单
# 场景
# 适用
- 嵌入式设备和物联网 SQLite 不需要额外的管理或服务启动,非常适合用在手机、电视、机顶盒、游戏机、相机、手表等智能设备上
- 缓存 SQLite 可以作为应用服务的缓存,减轻对中心数据库的压力
- 内存或者临时数据库得益于 SQLite 的简单快速,非常使用程序演示或者日常测试
# 不适用
- 存储大量数据,SQLite 的数据库文件大小限制在 2GB 左右,如果数据量过大,需要使用其他数据库
- 存储结构复杂的数据,SQLite 的数据类型比较单一,需要使用其他数据库
- 写入操作高并发时,SQLite 在任何时刻只允许一个写入操作执行,其他写入操作需要排队
# 安装
百度,很简单
# 其他
# 系统表
系统表是 sqlite 会自动生成的表
- sqlite_master: 是一个存储数据库元信息的特殊表,包含了数据库中所有其他表、索引、触发器和视图的描述信息
- type: 记录项目的类型,如 table、index、view、trigger。
- name: 记录项目的名称,如表名、索引名等。
- tbl_name: 记录所从属的表名,对于表来说,该列就是表名本身。
- rootpage: 记录项目在数据库页中存储的编号。对于视图和触发器,该列值为 0 或者 NULL。
- sql: 记录创建该项目的 SQL 语句。
- sqlite_sequence:保存其他表的 RowID 的最大值
- name:表名
- seq:当前表最大的 RowID
# 限制
SQLite3 对数据库或单个表的限制主要包括以下几个方面:
- 数据库文件大小:SQLite 的数据库文件大小最大可以达到
140TB
,但实际使用中受限于操作系统对文件大小的限制。 - 单个表的行数:单个表理论上可以存储的最大行数为
2^64(18,446,744,073,709,551,616)
行,但在实际应用中很少会达到这个数量级。 - 单行数据大小:单行数据的最大长度大约是
1GB(953MB 或 1,000,000,000 字节)
。这意味着一行数据不能超过这个大小。 - 单个字段的大小:单个字段的最大长度取决于其类型。对于文本和 BLOB 类型的数据,最大长度为
1GB(2^31 - 1 字节)
。 - 列的数量:每行数据的列数默认最大为
2000
列,可以通过编译时参数SQLITE_MAX_COLUMN
修改,默认值通常足够满足大多数需求。 - 表达式深度:SQL 表达式的嵌套深度默认最大为
1000
层,可通过编译时参数SQLITE_MAX_EXPR_DEPTH
修改。 - 事务大小:单个事务中可以包含的更改量没有明确的限制,但过大的事务可能会导致性能问题或内存不足错误。
- 并发访问:SQLite 是一个无服务器的嵌入式数据库,不支持高并发写操作。多个读取操作可以同时进行,但写操作需要独占锁。
这些限制在大多数应用场景下是足够的,但在特定情况下可能需要考虑其他数据库系统。
# 日志模式
设置方式,执行 PRAGMA journal_mode=?
,而当前支持的日志模式有如下几种:
- DELETE:删除模式,这是默认的日志模式,它将删除 journal 文件,并直接将更改写入数据库文件。
- TRUNCATE:截断模式,它将截断 journal 文件,而不是删除它。
- PERSIST:持久模式,它将 journal 文件标记为持久的,即使系统崩溃,它也不会被删除。
- MEMORY:内存模式,它将 journal 文件保存在内存中,而不是写入磁盘。
- WAL:Write-Ahead Logging 模式,它将更改写入一个名为 wal 的日志文件中,而不是直接写入数据库文件。
- OFF:关闭模式,它将关闭日志功能,将更改直接写入数据库文件。
除去 MEMORY 与 OFF 两种不常用的模式,其余四种实际上可以分为两个大类:WAL (预写日志) 与 Rollback (回滚日志) 模式。
# 事务日志机制
- WAL:SQLite 的事务日志机制,也称为 Write-Ahead Logging,会将所有更改(包括插入、更新和删除操作)先写入一个名为 wal 的日志文件中。这个日志文件保存了事务的变更记录。
- 提高读取性能,因为多个读者可以同时读取数据库而不会被写操作阻塞
- 更好的崩溃恢复能力,因为即使系统崩溃,也可以通过 WAL 文件恢复未完成的事务
- Rollback Journal:这是 SQLite 的默认模式。每次事务开始时会创建一个临时的 journal 文件,用于记录事务前的数据状态。如果事务成功提交,journal 文件会被删除;如果事务失败或系统崩溃,journal 文件将用于回滚未完成的更改。
- 简单且可靠,适用于大多数应用场景。
# 字段类型
- integer:带符号的整数
- real:浮点值
- text:文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储
- blob:二进制大对象,存储原始数据,如图片、音频、视频等
- smallint:16 位的整数
- integer:32 位的整数
- decimal (p,s):p 精确值和 s 大小的十进位整数,精确值 p 是指全部有几个数 (digits) 大小值,s 是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0
- float:32 位的实数
- double:64 位的实数
- char (n):n 长度的字串,n 不能超过 254
- varchar (n):长度不固定且其最大长度为 n 的字串,n 不能超过 4000
- graphic (n):和 char (n) 一样,不过其单位是两个字元 double-bytes, n 不能超过 127。这个形态是为了支援两个字元长度的字体,例如中文字
- vargraphic (n):可变长度且其最大长度为 n 的双字元字串,n 不能超过 2000
- date:包含了 年份、月份、日期
- time:包含了 小时、分钟、秒
- timestamp:包含了 年、月、日、时、分、秒、千分之一秒
- datetime:包含日期时间格式,必须写成 '2010-08-05' 不能写为 '2010-8-5',否则在读取时会产生错误
上次更新: 4/1/2025, 5:03:02 PM