目录
- 第一步:安装 MySQL 开发库
- 第二步:编写 C 语言连接代码
- 第三步:编译 C 程序
- 第四步:运行并测试
- 完整代码示例
- 关键函数解析
- 错误处理
- 资源释放(非常重要!)
- 进阶:执行 SQL 查询并获取结果
第一步:安装 MySQL 开发库
为了让你的 C 程序能够识别和链接 MySQL 的函数,你需要安装 MySQL 的开发头文件和库文件,这个包通常被称为 libmysqlclient-dev。

(图片来源网络,侵删)
对于 Debian/Ubuntu 系统:
打开终端,执行以下命令:
sudo apt-get update sudo apt-get install libmysqlclient-dev
对于 Red Hat/CentOS/Fedora 系统:
打开终端,执行以下命令:

(图片来源网络,侵删)
sudo yum install mysql-devel # 或者对于较新的系统 (如 Fedora 22+, CentOS 7+) sudo dnf install mariadb-devel # 如果使用 MariaDB
安装完成后,你就可以在代码中包含 <mysql.h> 头文件,并链接 -lmysqlclient 库了。
第二步:编写 C 语言连接代码
创建一个名为 mysql_connector.c 的文件,并输入以下代码。
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h> // 包含 MySQL 头文件
int main() {
// 1. 初始化连接句柄
MYSQL *conn;
conn = mysql_init(NULL);
// 2. 连接到数据库
// 请根据你的实际情况修改以下参数
const char *server = "localhost";
const char *user = "root";
const char *password = "your_password"; // 替换为你的 MySQL root 密码
const char *database = "test_db"; // 替换为你要连接的数据库名
if (conn == NULL) {
fprintf(stderr, "mysql_init() failed\n");
return EXIT_FAILURE;
}
// mysql_real_connect 是实际的连接函数
// 参数: 连接句柄, 服务器, 用户名, 密码, 数据库名, 端口, unix_socket, 客户端标志
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 EXIT_FAILURE;
}
printf("Successfully connected to the database!\n");
// 3. 在这里执行你的 SQL 操作...
// 4. 关闭连接
mysql_close(conn);
return EXIT_SUCCESS;
}
重要提示:
- 请务必将
your_password和test_db替换为你自己的 MySQL 密码和数据库名。 - 确保你的 MySQL 服务器正在运行,并且你配置的用户(这里是
root)有权限连接到指定的数据库。
第三步:编译 C 程序
你需要使用 gcc 来编译这个程序,关键在于链接 MySQL 的客户端库。

(图片来源网络,侵删)
在终端中,执行以下命令:
gcc mysql_connector.c -o mysql_connector $(mysql_config --cflags --libs)
命令解析:
gcc: C 语言编译器。mysql_connector.c: 你的源代码文件。-o mysql_connector: 指定输出的可执行文件名为mysql_connector。$(mysql_config --cflags --libs): 这是关键部分。mysql_config是一个工具,用于获取编译和链接 MySQL 程序所需的正确参数。--cflags: 返回编译所需的标志(如头文件路径-I/usr/include/mysql)。--libs: 返回链接所需的库(如库名-lmysqlclient和库路径-L/usr/lib/x86_64-linux-gnu)。- 是 shell 的命令替换,它会先执行
mysql_config命令,然后将输出结果作为参数传递给gcc。
第四步:运行并测试
如果编译成功,你会得到一个名为 mysql_connector 的可执行文件,运行它:
./mysql_connector
可能出现的情况:
-
成功:
Successfully connected to the database!这表示你的 C 程序已经成功连接到 MySQL 数据库。
-
失败(连接被拒绝):
mysql_real_connect() failed: Access denied for user 'root'@'localhost' (using password: YES)这通常意味着密码错误,或者
root用户没有从本地连接的权限,请检查你的 MySQL 用户配置。 -
失败(未知数据库):
mysql_real_connect() failed: Unknown database 'test_db'这表示你指定的数据库名不存在,请先在 MySQL 中创建该数据库。
-
失败(库找不到):
/usr/bin/ld: cannot find -lmysqlclient ...这说明编译时链接库失败了,最可能的原因是
libmysqlclient-dev没有正确安装,请返回第一步检查安装。
第五步:完整代码示例(带查询)
下面是一个更完整的示例,它连接数据库,执行一个简单的 SELECT 查询,并打印结果。
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>
int main() {
MYSQL *conn;
MYSQL_RES *res; // 结果集
MYSQL_ROW row; // 行数据
const char *server = "localhost";
const char *user = "root";
const char *password = "your_password";
const char *database = "test_db";
conn = mysql_init(NULL);
if (conn == NULL) {
fprintf(stderr, "mysql_init() failed\n");
return EXIT_FAILURE;
}
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 EXIT_FAILURE;
}
// 执行 SQL 查询
if (mysql_query(conn, "SELECT id, name FROM users")) {
fprintf(stderr, "SELECT query failed: %s\n", mysql_error(conn));
mysql_close(conn);
return EXIT_FAILURE;
}
// 获取结果集
res = mysql_store_result(conn);
if (res == NULL) {
if (mysql_field_count(conn) == 0) {
// 查询没有返回结果,可能是 UPDATE 或 INSERT
printf("%lu rows affected.\n", (unsigned long)mysql_affected_rows(conn));
} else {
// 获取结果集失败
fprintf(stderr, "mysql_store_result() failed: %s\n", mysql_error(conn));
mysql_close(conn);
return EXIT_FAILURE;
}
} else {
// 打印结果集中的每一行
printf("ID\tName\n");
printf("-----------------\n");
while ((row = mysql_fetch_row(res)) != NULL) {
printf("%s\t%s\n", row[0], row[1]);
}
// 释放结果集
mysql_free_result(res);
}
mysql_close(conn);
return EXIT_SUCCESS;
}
要运行此代码,你需要先在 test_db 数据库中创建一个 users 表并插入一些数据:
-- 在 MySQL 客户端中执行
CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Charlie');
关键函数解析
| 函数 | 作用 |
|---|---|
mysql_init() |
初始化一个 MYSQL 对象(连接句柄),在连接前必须调用。 |
mysql_real_connect() |
建立与 MySQL 服务器的实际连接,成功返回连接句柄,失败返回 NULL。 |
mysql_query() |
执行一个 SQL 查询,对于 SELECT、SHOW、DESCRIBE 等返回结果集的查询,它只执行查询,不获取数据。 |
mysql_store_result() |
从服务器获取完整的结果集并存储在客户端,适用于结果集不大的情况。 |
mysql_use_result() |
逐行获取结果集,不一次性全部加载到内存,适用于结果集非常大的情况,但会占用服务器资源。 |
mysql_fetch_row() |
从结果集中获取下一行数据,每次调用返回一个 MYSQL_ROW |
