C/C++连接MySQL实战指南:执行SQL请求详解

在开发高性能或系统级应用时,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 的典型步骤如下:

  1. 初始化 MySQL 连接句柄(mysql_init())
  2. 连接到数据库(mysql_real_connect())
  3. 发送 SQL 请求(mysql_query() 或 mysql_real_query())
  4. 处理结果集(如有)(mysql_store_result() / mysql_use_result())
  5. 释放资源并关闭连接(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 注入。

相关推荐
DevNote_4 小时前
1C1G 服务器从零配置实录(附完整命令)
linux·运维·服务器·javascript·adb·ssh·gmssh
瑞克-桑切斯1 天前
mysql二进制日志定时备份
adb
class心平气和1 天前
ADB 工具函数 Python 使用教程
开发语言·python·adb
程序员塔塔喵1 天前
【MySQL篇|第八篇】索引底层实现
数据库·mysql·adb·索引
pigdreams2 天前
Google 官方 Android CLI:让AI直接读布局结构而不是用adb截图验证
android·人工智能·adb
ha_lydms3 天前
AnalyticDB MySQL 技术架构
大数据·hadoop·mysql·adb·spark·dataworks·1024程序员节
2501_915106324 天前
跨平台抓包工具怎么选?TraceEagle抓包鹰 的四种跨平台能力
网络协议·计算机网络·网络安全·ios·adb·https·udp
梅孔立4 天前
.mdb Access_MDB历史数据文件迁移MySQL实战教程-可直接投喂给ai参考这个帮你完成迁移
数据库·mysql·adb
花间相见4 天前
【计算基础|MySQL13】【工程实战】事务隔离与 MVCC 现象复现
adb
吹什么轩5 天前
MySQL:数据类型
android·adb