头像


🎬 个人主页艾莉丝努力练剑

专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平

🎬 艾莉丝的简介:

在这里插入图片描述



在这里插入图片描述


1 ~> SQLite 数据库基础概述

1.1 SQLite 核心定义与特性

  • SQLite 是开源、轻量级、零配置、无服务器、自包含、事务性、支持标准 SQL、跨平台的关系型数据库引擎,以 C 库形式实现,源代码无版权限制。
  • 核心特性
    • 轻量级:编译后库文件仅数百 KB,资源占用极低。
    • 无服务器:不存在独立后台服务进程,应用程序直接调用库函数读写磁盘数据库文件。
    • 零配置:无需安装、启停、配置数据库服务。
    • 自包含:全部数据库内容(表、索引、元数据、数据)存放在**单个****.db**后缀磁盘文件,文件跨操作系统平台。
    • 事务性:完整支持 ACID(原子性、一致性、隔离性、持久性),断电、程序崩溃场景保障数据完整性。
    • 标准 SQL 支持:兼容绝大多数标准 SQL 语法,数据库最大支持 128TB。
    • 跨平台:Windows、Linux、macOS、嵌入式设备、移动端均可运行。
  • 典型适用场景
    • 嵌入式设备、移动端应用、本地桌面程序。
    • SDK 类项目:交付给终端用户使用,避免用户额外安装配置 MySQL 等数据库服务。
  • 与 MySQL 对比
    • MySQL:C/S 架构,独立数据库服务进程;需要安装配置;适合高并发、复杂业务的服务端业务;用户部署成本高。
    • SQLite:本地库文件,无服务进程;零配置;适合本地持久化存储,不适合高并发写场景;用户部署成本极低。

1.2 持久化存储背景

  • 内存属于易失性存储,断电、程序重启后内存内数据全部丢失。
  • 业务场景:聊天会话、历史对话记录必须持久化到磁盘,保障程序重启后数据不丢失。
  • SQLite 方案优势:SDK 交付场景,只需要链接库文件,终端用户不需要额外部署数据库环境。

2 ~> Ubuntu 环境 SQLite 环境部署

2.1 软件包说明

  1. sqlite3:SQLite 命令行交互工具,用于终端直接操作数据库。
  2. libsqlite3-dev:SQLite 开发库,提供头文件sqlite3.h、静态库libsqlite3.a、动态库libsqlite3.so,用于 C/C++ 代码开发。

2.2 安装命令

# 安装sqlite3命令行交互工具
sudo apt install sqlite3

# 安装SQLite开发库,代码编译必须依赖
sudo apt install libsqlite3-dev

# 查看开发包安装的全部文件与路径
dpkg -L libsqlite3-dev

2.3 关键安装路径

  • 头文件目录:/usr/include/
    • sqlite3.h 主头文件
    • sqlite3ext.h 扩展头文件
  • 库文件目录:/usr/lib/x86_64-linux-gnu/
    • libsqlite3.a:静态库
    • libsqlite3.so:动态库

2.4 编译链接配置

2.4.1 Makefile

# 编译时使用-lsqlite3链接SQLite库
g++ main.cpp -o my_program -lsqlite3

2.4.2 CMakeLists.txt

# 为目标程序链接sqlite3库
target_link_libraries(${SDK_NAME} sqlite3)

2.5 版本查看

sqlite3 --version

3 ~> SQLite 终端命令行操作

注意:SQLite 分为点命令(以****.**开头,sqlite 内置元命令,不是 SQL 标准语句)标准 SQL 语句**。SQL 语句必须以分号;结尾,点命令不能带分号。

3.1 启动命令行程序

sqlite3
  • 不指定数据库文件启动:默认连接内存临时数据库,退出之后所有数据全部丢失。
  • 使用.open 数据库名.db打开 / 创建磁盘持久化数据库文件。文件不存在则自动创建。

3.2 数据库相关点命令

命令功能说明使用示例
.open 文件名打开或者创建数据库文件.open studentDB.db
.databases显示当前所有已经挂载连接的数据库.databases
.attach 文件 as 别名附加挂载另外一个数据库文件.attach archive.db as archive
.backup 文件名将当前数据库备份到指定文件.backup backup.db
.restore 文件名从备份文件恢复数据库.restore recovery.db
.quit / .exit退出 sqlite3 终端程序.quit
.help查看全部内置点命令帮助.help
.version打印 SQLite 版本信息.version

3.3 表与结构相关点命令

命令功能说明使用示例
.tables列出当前数据库全部数据表.tables
.schema [表名]打印建表 SQL 语句,查看表结构.schema student
.indexes [表名]查看数据表索引.indexes student
.headers on开启查询结果表头显示.headers on
.mode column设置输出格式为对齐表格模式.mode column

3.4 终端完整实操示例

-- 打开/创建磁盘数据库studentDB.db
.open studentDB.db

-- 查看当前挂载数据库
.databases

-- 创建student学生表
CREATE TABLE student(
    stuid INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER,
    score REAL
);

-- 查看数据库所有表
.tables

-- 查看student表建表结构
.schema student

-- 批量插入学生数据
INSERT INTO student(name,age,score)
VALUES
('张三',18,92.0),
('李四',19,93.5),
('王五',18,76.5);

-- 查询全部学生数据
SELECT * FROM student;

-- 删除分数小于80分的学生
DELETE FROM student WHERE score < 80;

-- 再次查询验证删除结果
SELECT * FROM student;

-- 退出sqlite终端
.quit

4 ~> SQLite 数据类型体系

SQLite 采用动态类型系统:值的数据类型依附于存储的值本身,而不是依附于表列(容器)。同一个列可以存放不同存储类的数据。 两个核心概念:存储类列亲和类型 (Affinity)

4.1 存储类(磁盘真实存储格式)

存储类代表数据在磁盘上物理存储的真实类型,一共 5 种:

存储类描述
NULL空值
INTEGER有符号整数,根据数值大小占用 1/2/3/4/6/8 字节
REAL8 字节 IEEE 双精度浮点数字
TEXTUTF‑8 / UTF‑16BE / UTF‑16LE 编码文本字符串
BLOB原始二进制数据,原样输入原样存储,不做任何转换

4.2 亲和类型(Affinity,列存储偏好)

  • 亲和类型是列的存储偏好建议,不是强制约束。
  • 插入数据时,SQLite 结合输入原始数据 + 列亲和类型规则,自动转换选择最终使用的存储类。
  • 即使定义 INT 列,依然可以插入字符串;定义 TEXT 列也可以插入数字。数据库会按照亲和规则尝试转换,转换失败则保留原始存储类。

4.2.1 五种亲和类型规则

  1. TEXT
    1. 数值插入该列,优先转换为 TEXT 文本存储。
  2. NUMERIC
    1. 文本数据尽可能无损可逆转换 INTEGER/REAL;转换失败则保留 TEXT。
    2. "30000.0" 可以无损转整数时,转为 INTEGER 存储。
  3. INTEGER
    1. 转换规则同 NUMERIC;仅在 CAST 类型转换表达式行为和 NUMERIC 存在区别。
  4. REAL
    1. 规则同 NUMERIC;不会把"30000.0"这类浮点文本自动转为 INTEGER。
  5. NONE
    1. 不做任何转换,直接使用输入值原生存储类保存。

4.3 建表数据类型名称与亲和类型映射

建表语句书写的字段类型名称,SQLite 内部映射为对应亲和类型。用户只需要写业务语义类型,不需要手动指定存储类。

建表声明类型映射亲和类型
INT、INTEGER、TINYINT、SMALLINT、MEDIUMINT、BIGINT、UNSIGNED BIG INT、INT2、INT8INTEGER
CHARACTER(n)、VARCHAR(n)、VARYING CHARACTER(n)、NCHAR(n)、NATIVE CHARACTER(n)、NVARCHAR(n)、TEXT、CLOBTEXT
BLOBNONE
REAL、DOUBLE、DOUBLE PRECISION、FLOATREAL
NUMERIC、DECIMAL、BOOLEAN、DATENUMERIC

4.4 类型转换实例

CREATE TABLE test(
    a INT,     -- 亲和类型:INTEGER
    b TEXT     -- 亲和类型:TEXT
);

-- a列定义INT(INTEGER亲和),插入字符串'123'
-- SQLite按照INTEGER亲和规则,无损转换存储类INTEGER,存储值123
-- b列定义TEXT亲和,插入数字456,自动转为TEXT存储'456'
INSERT INTO test(a,b) VALUES ('123', 456);

开发实践:业务建表按照业务语义写字段类型即可,不需要关心底层存储类、亲和类型细节。


5 ~> 建表语法易错点修正

5.1 主键自增关键字错误

  • ❌错误写法:PRIMARY KEY AUTOCREMENT(拼写错误)
  • ✅正确写法:PRIMARY KEY AUTOINCREMENT
CREATE TABLE student(
    stuid INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER,
    score REAL
);

AUTOINCREMENT仅对 INTEGER 主键生效,实现自增 ID。

5.2 字段约束说明

  • PRIMARY KEY:主键约束,唯一非空。
  • AUTOINCREMENT:主键自增,插入记录不指定主键时自动分配递增整数。
  • NOT NULL:该字段禁止存入 NULL 空值。

6 ~> SQLite 核心 SQL 基础 CRUD

6.1 CREATE TABLE 创建表

CREATE TABLE IF NOT EXISTS 表名(
    列名 类型 [约束],
    列名 类型 [约束],
    ...
);

6.2 INSERT 插入数据

-- 指定字段插入单行
INSERT INTO student(name, age, score) VALUES ('张三', 18, 92.0);

-- 批量多行插入
INSERT INTO student(name,age,score)
VALUES
('李四',19,93.5),
('王五',18,76.5);

6.3 SELECT 查询

-- 查询全部列全部行
SELECT * FROM student;

-- 带WHERE条件过滤
SELECT * FROM student WHERE score > 80;

6.4 DELETE 删除

-- 删除满足where条件记录;where不可省略,省略会清空整张表
DELETE FROM student WHERE score < 80;

6.5 UPDATE 更新

UPDATE student SET score=95 WHERE stuid=1;

6.6 DROP TABLE 删除表

DROP TABLE IF EXISTS student;

7 ~> SQLite 重要面试补充知识点

7.1 内存数据库

  • sqlite3 :memory: 打开纯内存数据库,全部数据存在内存,程序退出数据全部销毁。
  • .open打开普通 db 文件才会持久化磁盘。

7.2 AUTOINCREMENT 特性

  • INTEGER PRIMARY KEY 本身就具备自增能力;AUTOINCREMENT关键字会强制 ID 单调递增,删除最大 ID 后,新插入 ID 不会复用旧删除 ID,会继续往后增长,带来轻微性能开销。

7.3 SQLite 并发限制

  • 读可以并发,写操作串行;同一时刻只能有一个写事务。高并发写业务场景不适合使用 SQLite。

7.4 SQLite 事务

  • 默认每条 DML 语句(INSERT/UPDATE/DELETE)默认是隐式事务,执行完成自动提交。
  • 显式事务语法:
BEGIN;
INSERT INTO student(name,age,score) VALUES ('小明', 20, 88);
INSERT INTO student(name,age,score) VALUES ('小红', 21, 90);
COMMIT; --提交
-- ROLLBACK; --回滚,放弃全部修改

7.5 SQLite 文件锁

SQLite 依靠操作系统文件锁实现并发控制,不同平台文件锁行为存在差异。

7.6 NULL 处理

SQLite 三值逻辑,NULL = NULL结果不为真;判断空值必须使用IS NULL / IS NOT NULL,禁止使用=比较 NULL。

-- ✅正确
SELECT * FROM student WHERE name IS NULL;

-- ❌错误,不能使用=匹配NULL
SELECT * FROM student WHERE name = NULL;

8 ~> 开发资源参考

  1. SQLite 官网:https://sqlite.org
  2. SQLite 菜鸟教程:https://www.runoob.com/sqlite/sqlite-tutorial.html
  3. C/C++ 开发:包含头文件#include <sqlite3.h>,编译链接-lsqlite3库。

9 ~> 面试高频简答整理

  1. SQLite 特点:轻量无服务、单 db 文件、零配置、ACID 事务、跨平台、动态类型;适合嵌入式 / 桌面本地持久化,不适合高并发写。
  2. SQLite 动态类型:数据类型绑定值本身,不是绑定列;通过亲和类型做插入转换,一列允许存多种类型。
  3. 存储类 vs 亲和类型:存储类是磁盘真实存储格式;亲和类型是列的转换偏好建议,不是强制约束。
  4. AUTOINCREMENT:INTEGER 主键自增关键字,拼写易错;会禁止复用已删除主键 ID,带来微小性能损耗。
  5. SQLite 与 MySQL 选型:本地桌面 / SDK 交付选 SQLite;服务端高并发业务选择 MySQL。
  6. 编译链接:C++ 开发 Ubuntu 安装libsqlite3-dev,编译加-lsqlite3链接参数。
  7. 点命令.open .tables .schema 等以.开头,不属于 SQL 语句,不要加分号。
  8. 内存数据库:直接运行sqlite3不加文件名,操作内存数据库,退出数据丢失,必须.open xxx.db才能持久化磁盘。

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!

艾莉丝努力练剑

C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主


👀 【关注】 跟随我一起深耕技术领域,见证每一次成长。
❤️ 【点赞】 让优质内容被更多人看见,让知识传递更有力量。
【收藏】 把核心知识点存好,在需要时随时查、随时用。
💬 【评论】 分享你的经验或疑问,评论区一起交流避坑!

不要忘记给博主“一键四连”哦!

“今日练剑达成!”

“技术之路难免有困惑,但同行的人会让前进更有方向。”

结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!

往期回顾

【AI大模型接入SDK】C++会话管理模块(SessionManager)设计与实现

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡
૮₍ ˶ ˊ ᴥ ˋ˶₎ა

在这里插入图片描述

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐