在开发高性能或系统级应用时,C/C++因其接近硬件、运行效率高的特点被广泛使用。而当这类应用需要与数据库交互时,MySQL 提供了官方的 C API(即 MySQL Connector/C),使得开发者可以直接在 C/C++ 程序中连接、查询和操作 MySQL 数据库。
本文将聚焦于 如何使用 C/C++ 连接 MySQL 并发送 SQL 请求,涵盖从环境准备到执行查询的完整流程,并提供可直接运行的示例代码。
一、准备工作
1. 安装 MySQL 开发库
在 Linux 系统(如 Ubuntu/Debian)上,可通过以下命令安装 MySQL 客户端开发库:
sudo apt-get install libmysqlclient-dev
在 CentOS/RHEL 上:
sudo yum install mysql-devel
# 或(较新版本)
sudo dnf install mysql-devel
Windows 用户可从 MySQL 官网 下载 Connector/C。
2. 编译链接选项
编译时需链接 libmysqlclient 库。例如:
gcc -o myapp myapp.c -lmysqlclient
二、基本流程概览
使用 C API 操作 MySQL 的典型步骤如下:
- 初始化 MySQL 连接句柄(
mysql_init()) - 连接到数据库(
mysql_real_connect()) - 发送 SQL 请求(
mysql_query()或mysql_real_query()) - 处理结果集(如有)(
mysql_store_result()/mysql_use_result()) - 释放资源并关闭连接(
mysql_close())
三、连接数据库
#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
MYSQL *conn;
const char *server = "localhost";
const char *user = "your_user";
const char *password = "your_password";
const char *database = "test_db";
// 初始化连接结构
conn = mysql_init(NULL);
if (conn == NULL) {
fprintf(stderr, "mysql_init() failed\n");
exit(1);
}
// 连接数据库
if (mysql_real_connect(conn, server, user, password, database, 0, NULL, 0) == NULL) {
fprintf(stderr, "Connection failed: %s\n", mysql_error(conn));
mysql_close(conn);
exit(1);
}
printf("Connected to MySQL successfully!\n");
// 后续操作...
mysql_close(conn);
return 0;
}
注意:请将
your_user、your_password和test_db替换为实际值。
四、发送 SQL 请求
1. 执行非查询语句(INSERT / UPDATE / DELETE)
这些语句不返回结果集,只需检查是否执行成功:
const char *sql = "INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com')";
if (mysql_query(conn, sql)) {
fprintf(stderr, "Query error: %s\n", mysql_error(conn));
} else {
printf("Insert successful. Affected rows: %llu\n", mysql_affected_rows(conn));
}
2. 执行查询语句(SELECT)
查询会返回结果集,需进一步处理:
const char *query = "SELECT id, name, email FROM users";
if (mysql_query(conn, query)) {
fprintf(stderr, "SELECT error: %s\n", mysql_error(conn));
return 1;
}
MYSQL_RES *result = mysql_store_result(conn);
if (result == NULL) {
fprintf(stderr, "Store result error: %s\n", mysql_error(conn));
return 1;
}
// 获取字段数量
int num_fields = mysql_num_fields(result);
// 遍历每一行
MYSQL_ROW row;
while ((row = mysql_fetch_row(result))) {
for (int i = 0; i < num_fields; i++) {
printf("%s\t", row[i] ? row[i] : "NULL");
}
printf("\n");
}
// 释放结果集
mysql_free_result(result);
使用
mysql_store_result()会一次性将全部结果加载到内存,适用于数据量较小的场景;若处理大量数据,可考虑mysql_use_result()流式读取。
五、错误处理建议
- 始终检查
mysql_query()的返回值。 - 使用
mysql_error(conn)获取详细错误信息。 - 在程序退出前务必调用
mysql_close()释放连接资源。
六、编译与运行示例
假设源文件为 mysql_demo.c,编译命令如下:
gcc -o mysql_demo mysql_demo.c $(mysql_config --cflags --libs)
mysql_config是 MySQL 提供的工具,可自动输出正确的编译和链接参数。
七、小结
通过 MySQL 的 C API,C/C++ 程序可以高效地与数据库交互。虽然相比高级语言(如 Python、Java)略显繁琐,但在对性能、资源控制有严格要求的场景下,C/C++ 仍是不可替代的选择。
掌握连接、发送请求、处理结果这三个核心环节,即可构建出稳定可靠的数据库客户端程序。后续还可深入学习预处理语句(mysql_stmt_* 系列函数)以提升安全性和效率,防止 SQL 注入。