- 环境准备: 确保你的 CentOS 系统已经安装了 C 语言编译器和 MySQL 数据库。
- 安装 MySQL C 开发库: 这是连接 MySQL 所需的头文件和链接库。
- 编写 C 代码: 编写一个简单的 C 程序来连接 MySQL、执行 SQL 语句并处理结果。
- 编译和运行: 使用 GCC 编译你的 C 程序,并运行它。
第 1 步:环境准备
你需要确保你的 CentOS 系统上已经安装了 gcc (C 编译器) 和 mysql-server (MySQL 数据库服务器)。

1 安装 GCC (C 编译器)
打开终端,运行以下命令:
# 更新软件包列表 sudo yum update -y # 安装 GCC 和相关开发工具 sudo yum groupinstall "Development Tools" -y
安装完成后,你可以通过以下命令验证 gcc 是否安装成功:
gcc --version
2 安装 MySQL 服务器
CentOS 7/8 推荐使用官方的 MySQL Yum 仓库。
对于 CentOS 7:

# 下载并添加 MySQL 官方 Yum 仓库 sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm -y # 验证仓库是否已添加 sudo yum repolist enabled | grep ".*\.\(.*\.\).*-.*-.*" | grep ".*MySQL.*" # 安装 MySQL 服务器 sudo yum install mysql-community-server -y
对于 CentOS 8:
# 下载并添加 MySQL 官方 Yum 仓库 sudo dnf install https://dev.mysql.com/get/mysql80-community-el8-1.noarch.rpm -y # 验证仓库 sudo dnf repolist enabled | grep ".*\.\(.*\.\).*-.*-.*" | grep ".*\"MySQL.*\"." # 安装 MySQL 服务器 sudo dnf install mysql-community-server -y
3 启动并配置 MySQL
安装完成后,启动 MySQL 服务并设置其开机自启:
# 启动 MySQL 服务 sudo systemctl start mysqld # 设置开机自启 sudo systemctl enable mysqld
为了安全起见,运行 mysql_secure_installation 脚本,它会为你设置 root 密码、移除匿名用户、禁止 root 远程登录等。请务必记住你设置的 root 密码。
sudo mysql_secure_installation
第 2 步:安装 MySQL C 开发库
这是最关键的一步,你需要安装 mysql-devel 包,它包含了 C 语言编程所需的头文件(如 mysql.h)和链接库。

# 对于 CentOS 7 sudo yum install mysql-community-devel -y # 对于 CentOS 8 sudo dnf install mysql-community-devel -y
安装完成后,你可以验证头文件是否存在:
ls /usr/include/mysql/mysql.h
如果命令能找到文件,说明安装成功。
第 3 步:编写 C 语言代码
我们创建一个 C 语言文件来演示如何连接 MySQL、创建一个表、插入数据、查询数据。
创建一个名为 mysql_test.c 的文件:
vim mysql_test.c
将以下代码粘贴到文件中。请务必将 your_password 替换为你自己设置的 MySQL root 密码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h> // 包含 MySQL 的头文件
// 定义数据库连接信息
#define HOST "localhost"
#define USER "root"
#define PASSWORD "your_password" // <-- 修改成你的 MySQL root 密码
#define DATABASE "test_db" // 我们将使用这个数据库
int main() {
MYSQL *conn; // MySQL 连接句柄
MYSQL_RES *res; // 结果集
MYSQL_ROW row; // 结果集的行
int num_fields; // 结果集的字段数
int i;
// 1. 初始化连接句柄
conn = mysql_init(NULL);
if (conn == NULL) {
fprintf(stderr, "mysql_init() failed\n");
return EXIT_FAILURE;
}
// 2. 连接到 MySQL 服务器
// 参数: 连接句柄, 主机, 用户, 密码, 数据库名, 端口, unix_socket, client_flag
if (mysql_real_connect(conn, HOST, USER, PASSWORD, DATABASE, 0, NULL, 0) == NULL) {
fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
mysql_close(conn);
return EXIT_FAILURE;
}
printf("Successfully connected to MySQL database: %s\n", DATABASE);
// 3. 执行 SQL 创建表 (如果表不存在)
const char *create_table_sql = "CREATE TABLE IF NOT EXISTS users ("
"id INT AUTO_INCREMENT PRIMARY KEY,"
"name VARCHAR(50) NOT NULL,"
"age INT NOT NULL"
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
if (mysql_query(conn, create_table_sql)) {
fprintf(stderr, "CREATE TABLE failed: %s\n", mysql_error(conn));
mysql_close(conn);
return EXIT_FAILURE;
}
printf("Table 'users' is ready.\n");
// 4. 执行 SQL 插入数据
const char *insert_sql = "INSERT INTO users (name, age) VALUES ('Alice', 30), ('Bob', 25);";
if (mysql_query(conn, insert_sql)) {
fprintf(stderr, "INSERT failed: %s\n", mysql_error(conn));
mysql_close(conn);
return EXIT_FAILURE;
}
printf("Inserted %lu rows.\n", (unsigned long)mysql_affected_rows(conn));
// 5. 执行 SQL 查询数据
const char *query_sql = "SELECT id, name, age FROM users;";
if (mysql_query(conn, query_sql)) {
fprintf(stderr, "SELECT failed: %s\n", mysql_error(conn));
mysql_close(conn);
return EXIT_FAILURE;
}
// 6. 获取结果集
res = mysql_store_result(conn);
if (res == NULL) {
if (mysql_field_count(conn) == 0) {
// 这是一个没有结果集的查询 (如 INSERT, UPDATE)
printf("No result set.\n");
} else {
fprintf(stderr, "mysql_store_result() failed: %s\n", mysql_error(conn));
mysql_close(conn);
return EXIT_FAILURE;
}
} else {
// 7. 遍历并打印结果集
num_fields = mysql_num_fields(res);
while ((row = mysql_fetch_row(res))) {
for (i = 0; i < num_fields; i++) {
printf("%s\t", row[i] ? row[i] : "NULL");
}
printf("\n");
}
// 释放结果集内存
mysql_free_result(res);
}
// 8. 关闭连接
mysql_close(conn);
printf("Connection closed.\n");
return EXIT_SUCCESS;
}
第 4 步:编译和运行 C 程序
我们使用 gcc 来编译 mysql_test.c,关键在于要链接 mysqlclient 库。
1 编译命令
在终端中,进入 mysql_test.c 所在的目录,然后执行以下编译命令:
gcc mysql_test.c -o mysql_test $(mysql_config --cflags --libs)
命令解释:
gcc mysql_test.c: 指定要编译的源文件。-o mysql_test: 指定输出的可执行文件名为mysql_test。$(mysql_config --cflags --libs): 这是关键部分。mysql_config是一个工具,用于获取编译和链接 MySQL 程序所需的正确参数。--cflags: 返回编译时需要的头文件路径和其他标志。--libs: 返回链接时需要的库文件路径和库名(如-lmysqlclient)。- 使用 是 shell 的命令替换功能,它会先执行
mysql_config命令,然后将输出结果作为参数传递给gcc。
2 运行程序
编译成功后,你会得到一个名为 mysql_test 的可执行文件,运行它:
./mysql_test
如果一切顺利,你将看到如下输出(可能略有不同):
Successfully connected to MySQL database: test_db
Table 'users' is ready.
Inserted 2 rows.
id name age
1 Alice 30
2 Bob 25
Connection closed.
你也可以登录到 MySQL 客户端中查看数据库的变化:
mysql -u root -p # 输入密码 USE test_db; SELECT * FROM users;
常见问题排查
-
/usr/bin/ld: cannot find -lmysqlclient错误- 原因: 这是最常见的错误,表示链接器找不到
mysqlclient库,通常是因为没有安装mysql-community-devel包。 - 解决: 确保你已经执行了
sudo yum install mysql-community-devel -y命令。
- 原因: 这是最常见的错误,表示链接器找不到
-
mysql.h: No such file or directory错误- 原因: 编译器找不到
mysql.h头文件,同样是mysql-community-devel包没有安装。 - 解决: 同上,安装
mysql-community-devel。
- 原因: 编译器找不到
-
Access denied for user 'root'@'localhost'错误- 原因: C 程序中使用的密码不正确。
- 解决: 仔细检查
mysql_test.c文件中的PASSWORD宏,确保密码完全正确,包括大小写和特殊字符。
-
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'错误- 原因: MySQL 服务没有启动,或者 C 程序和 MySQL 服务使用的通信方式不匹配。
- 解决: 确保服务正在运行 (
sudo systemctl status mysqld),如果问题依旧,可以在mysql_real_connect中将unix_socket参数设置为NULL,让库自动寻找。
通过以上步骤,你应该已经成功地在 CentOS 系统上使用 C 语言连接并操作了 MySQL 数据库,这是进行底层数据库编程和开发高性能应用的基础。
