CentOS系统下C语言与MySQL的交互实践
CentOS系统环境准备
CentOS作为一款广泛使用的Linux发行版,为开发提供了稳定的环境,在开始C语言与MySQL交互之前,需确保系统已安装必要的工具和库,通过yum或dnf包管理器更新系统:

sudo yum update -y
安装开发工具链,包括GCC编译器、Make工具等:
sudo yum groupinstall "Development Tools" -y
需安装MySQL的开发库,以便C程序能够调用MySQL提供的API,以MySQL 8.0为例,执行以下命令:
sudo yum install mysql-devel -y
安装完成后,可通过mysql_config --version验证MySQL开发库是否正确安装。
MySQL数据库基础操作
在CentOS中,MySQL服务可通过systemctl管理,启动MySQL服务并设置为开机自启:
sudo systemctl start mysqld sudo systemctl enable mysqld
首次安装后,需运行安全脚本设置root密码并移除匿名用户:
sudo mysql_secure_installation
创建一个用于测试的数据库和用户,登录MySQL命令行:

mysql -u root -p
执行以下SQL语句:
CREATE DATABASE test_db; CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost'; FLUSH PRIVILEGES;
数据库test_db和用户test_user已准备就绪,可供C程序连接。
C语言连接MySQL的代码实现
C语言通过MySQL C API与数据库交互,以下是一个简单的示例程序,展示如何连接MySQL、执行查询并处理结果。
创建一个名为mysql_test.c的文件:
#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
const char *server = "localhost";
const char *user = "test_user";
const char *password = "password";
const char *database = "test_db";
conn = mysql_init(NULL);
if (conn == NULL) {
fprintf(stderr, "mysql_init() failed\n");
return 1;
}
if (mysql_real_connect(conn, server, user, password, database, 0, NULL, 0) == NULL) {
fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
mysql_close(conn);
return 1;
}
if (mysql_query(conn, "CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100))")) {
fprintf(stderr, "CREATE TABLE failed: %s\n", mysql_error(conn));
mysql_close(conn);
return 1;
}
if (mysql_query(conn, "INSERT INTO users (name) VALUES ('Alice')")) {
fprintf(stderr, "INSERT failed: %s\n", mysql_error(conn));
mysql_close(conn);
return 1;
}
if (mysql_query(conn, "SELECT * FROM users")) {
fprintf(stderr, "SELECT failed: %s\n", mysql_error(conn));
mysql_close(conn);
return 1;
}
res = mysql_store_result(conn);
if (res == NULL) {
fprintf(stderr, "mysql_store_result() failed\n");
mysql_close(conn);
return 1;
}
printf("Users:\n");
while ((row = mysql_fetch_row(res)) != NULL) {
printf("%s: %s\n", row[0], row[1]);
}
mysql_free_result(res);
mysql_close(conn);
return 0;
}
编译与运行程序
使用GCC编译上述代码时,需链接MySQL客户端库,通过以下命令编译:
gcc mysql_test.c -o mysql_test $(mysql_config --cflags --libs)
编译成功后,执行程序:

./mysql_test
程序将输出users表中的数据,验证C与MySQL的交互是否正常。
常见问题与调试技巧
在开发过程中,可能会遇到连接失败或查询错误等问题,以下是一些常见排查方法:
- 连接失败:检查MySQL服务是否运行,用户名、密码及数据库名是否正确。
- 权限问题:确保用户有足够的权限执行操作,可通过
GRANT语句授权。 - 库文件缺失:若编译时报错“mysql.h not found”,需确认
mysql-devel已安装。 - 字符集问题:若中文显示乱码,可在连接时设置字符集:
mysql_set_character_set(conn, "utf8mb4")。
FAQs
Q1: 如何在C程序中处理MySQL的预处理语句?
A1: 预处理语句可有效防止SQL注入,使用mysql_stmt_init()、mysql_prepare()和mysql_stmt_execute()等函数实现。
MYSQL_STMT *stmt = mysql_stmt_init(conn);
mysql_prepare(stmt, "INSERT INTO users (name) VALUES (?)", strlen("INSERT INTO users (name) VALUES (?)"));
MYSQL_BIND bind;
memset(&bind, 0, sizeof(bind));
bind.buffer_type = MYSQL_TYPE_STRING;
bind.buffer = "Bob";
bind.buffer_length = strlen("Bob");
mysql_stmt_bind_param(stmt, &bind);
mysql_stmt_execute(stmt);
mysql_stmt_close(stmt);
Q2: 如何优化C与MySQL交互的性能?
A2: 可通过以下方式优化:
- 使用连接池管理数据库连接,避免频繁创建和销毁连接。
- 批量插入数据时,使用
LOAD DATA INFILE替代单条插入。 - 减少查询结果集大小,仅选择必要的字段。
- 启用MySQL的查询缓存(需根据场景权衡)。