CentOS下C语言如何连接MySQL?

99ANYc3cd6
预计阅读时长 25 分钟
位置: 首页 C语言 正文
  1. 环境准备: 确保你的 CentOS 系统已经安装了 C 语言编译器和 MySQL 数据库。
  2. 安装 MySQL C 开发库: 这是连接 MySQL 所需的头文件和链接库。
  3. 编写 C 代码: 编写一个简单的 C 程序来连接 MySQL、执行 SQL 语句并处理结果。
  4. 编译和运行: 使用 GCC 编译你的 C 程序,并运行它。

第 1 步:环境准备

你需要确保你的 CentOS 系统上已经安装了 gcc (C 编译器) 和 mysql-server (MySQL 数据库服务器)。

centos c语言 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:

centos c语言 mysql
(图片来源网络,侵删)
# 下载并添加 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 c语言 mysql
(图片来源网络,侵删)
# 对于 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;

常见问题排查

  1. /usr/bin/ld: cannot find -lmysqlclient 错误

    • 原因: 这是最常见的错误,表示链接器找不到 mysqlclient 库,通常是因为没有安装 mysql-community-devel 包。
    • 解决: 确保你已经执行了 sudo yum install mysql-community-devel -y 命令。
  2. mysql.h: No such file or directory 错误

    • 原因: 编译器找不到 mysql.h 头文件,同样是 mysql-community-devel 包没有安装。
    • 解决: 同上,安装 mysql-community-devel
  3. Access denied for user 'root'@'localhost' 错误

    • 原因: C 程序中使用的密码不正确。
    • 解决: 仔细检查 mysql_test.c 文件中的 PASSWORD 宏,确保密码完全正确,包括大小写和特殊字符。
  4. 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 数据库,这是进行底层数据库编程和开发高性能应用的基础。

-- 展开阅读全文 --
头像
C语言timer_create如何正确使用?
« 上一篇 2025-12-17
C语言如何操作并行端口?
下一篇 » 2025-12-17

相关文章

取消
微信二维码
支付宝二维码

目录[+]