一、C语言数据库编程概述

说实话,很多人一听到「数据库」三个字,脑子里蹦出来的就是 MySQL、Oracle 这些庞然大物。但咱们做嵌入式开发的,哪有那么多资源去跑这些?我早年在一个智能家居项目里,MCU 只有 64KB Flash,连个文件系统都跑得勉强,更别提装数据库了。

但数据总得存吧?设备参数、日志记录、用户配置……总不能每次都写个自定义的二进制文件,然后自己写一套增删改查吧?那太累了,而且容易出 bug。

嗯,这时候嵌入式数据库就派上用场了。

1.1 数据库基础概念

先简单过一下基础。数据库,说白了就是「有组织的数据集合」。跟 Excel 表格有点像,但更强大——支持并发、事务、索引、查询优化这些。

几个核心概念你得记住:

  • 表(Table):数据存储的基本单位。一张表就像一张电子表格,有行有列。
  • 记录(Record):表中的一行数据。比如一个用户的全部信息。
  • 字段(Field):表中的一列。比如用户名、年龄、手机号。
  • 主键(Primary Key):唯一标识一条记录的字段。不能重复,不能为空。
  • 索引(Index):加速查询的数据结构。就像书的目录,没有索引就得逐行扫描。
  • 事务(Transaction):一组操作,要么全部成功,要么全部失败。我在项目中遇到过掉电导致数据损坏的情况,后来全靠事务才解决。

核心要点:嵌入式环境下的数据库,跟服务器端数据库最大的区别在于——资源受限、不能有独立进程、必须能直接链接到应用程序中。

1.2 嵌入式数据库与C语言

嵌入式数据库,也叫「内嵌式数据库」。它不像 MySQL 那样跑成一个独立服务,而是作为一个库直接链接到你的程序里。你的 C 代码调用它的 API,它就在当前进程空间里读写数据。

为什么 C 语言特别适合搞这个?

  • C 语言可以直接操作内存和文件,没有中间层开销
  • 嵌入式设备上 C 是绝对主流,几乎没有别的选择
  • 很多嵌入式数据库本身就是用 C 写的,API 天然兼容

我个人习惯在嵌入式项目里用 SQLite 或者更轻量的库。你想想看,如果每次存个配置都要写几十行文件解析代码,那多划不来?

小提示:嵌入式数据库不一定非得是 SQL 的。像 Berkeley DB 这种 key-value 型数据库也很常见。但 SQL 的好处是查询灵活,后期改需求不用改代码。

1.3 SQLite 简介

SQLite 是目前最流行的嵌入式数据库引擎。它的特点我列一下:

特性 说明
零配置 不需要安装、不需要配置、不需要管理员
单文件存储 整个数据库就是一个文件,拷贝即备份
轻量级 完整库不到 600KB,最小配置可以到 300KB 以内
ACID 事务 支持原子性、一致性、隔离性、持久性
SQL 支持 支持大部分 SQL-92 标准
跨平台 Windows、Linux、macOS、各种 RTOS 都能跑

我曾经在一个农业物联网项目里用 SQLite 存储传感器数据。设备每天产生上万条记录,用 SQLite 配合 WAL 模式,读写性能完全够用。后来客户要求加个历史趋势查询,我直接写个 SQL 语句就搞定了——要是用自定义文件格式,估计得改好几天。

注意:SQLite 不适合高并发写入场景。如果多个线程同时写同一个数据库,性能会急剧下降。我在一个多线程日志系统里踩过这个坑,后来改成每个线程独立数据库文件才解决。

1.4 环境搭建

搭建 SQLite 开发环境其实很简单。我一般分三步走:

  1. 下载源码或预编译库:从 sqlite.org 下载 sqlite3.c 和 sqlite3.h(合并版,就两个文件)
  2. 编译:直接 gcc 编译你的源文件时带上 sqlite3.c 即可
  3. 验证:写个简单的测试程序,确认能正常打开和关闭数据库

下面是一个最简验证代码:

#include <stdio.h>
#include "sqlite3.h"

int main(void) {
    sqlite3 *db = NULL;
    int rc = sqlite3_open("test.db", &db);
    
    if (rc != SQLITE_OK) {
        fprintf(stderr, "打开数据库失败: %s\n", sqlite3_errmsg(db));
        return 1;
    }
    
    printf("数据库打开成功!\n");
    sqlite3_close(db);
    return 0;
}

编译命令:

gcc -o test test.c sqlite3.c -lpthread -ldl

嗯,这里要注意:Linux 下需要链接 pthread 和 dl 库。Windows 下用 MSVC 的话,直接编译 sqlite3.c 就行,不需要额外链接。

我的习惯:在嵌入式项目里,我通常把 sqlite3.c 和 sqlite3.h 直接放到项目源码目录下,跟其他源文件一起编译。这样不依赖外部库,交叉编译也方便。

1.5 本章知识体系

下面这张图概括了本章的核心内容。我画的时候特意把「C语言」放在中间——因为它是连接嵌入式系统和数据库的桥梁。

C语言数据库编程 数据库基础概念 表 / 记录 / 字段 主键 / 索引 / 事务 嵌入式数据库 零配置 / 单文件 轻量级 / ACID SQLite 环境搭建 下载源码 编译链接 验证测试

从这张图你可以看到,整个知识体系是围绕「C语言」这个核心展开的。左边是数据库的理论基础,右边是嵌入式数据库的特性,下面是具体的 SQLite 实践。三者缺一不可。

好了,环境搭好了,下一章咱们就开始写真正的 C 代码操作 SQLite 了。到时候我会带你从建表、插入、查询一步步走,把每个 API 的坑都给你指出来——这些可都是我用实际项目换来的经验。


公众号:蓝海资料掘金营,微信deep3321