linux c语言连接mysql数据库

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 C语言 正文

目录

  1. 第一步:安装 MySQL 开发库
  2. 第二步:编写 C 语言连接代码
  3. 第三步:编译 C 程序
  4. 第四步:运行并测试
  5. 完整代码示例
  6. 关键函数解析
  7. 错误处理
  8. 资源释放(非常重要!)
  9. 进阶:执行 SQL 查询并获取结果

第一步:安装 MySQL 开发库

为了让你的 C 程序能够识别和链接 MySQL 的函数,你需要安装 MySQL 的开发头文件和库文件,这个包通常被称为 libmysqlclient-dev

linux c语言连接mysql数据库
(图片来源网络,侵删)

对于 Debian/Ubuntu 系统:

打开终端,执行以下命令:

sudo apt-get update
sudo apt-get install libmysqlclient-dev

对于 Red Hat/CentOS/Fedora 系统:

打开终端,执行以下命令:

linux c语言连接mysql数据库
(图片来源网络,侵删)
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_passwordtest_db 替换为你自己的 MySQL 密码和数据库名。
  • 确保你的 MySQL 服务器正在运行,并且你配置的用户(这里是 root)有权限连接到指定的数据库。

第三步:编译 C 程序

你需要使用 gcc 来编译这个程序,关键在于链接 MySQL 的客户端库。

linux c语言连接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

可能出现的情况:

  1. 成功:

    Successfully connected to the database!

    这表示你的 C 程序已经成功连接到 MySQL 数据库。

  2. 失败(连接被拒绝):

    mysql_real_connect() failed: Access denied for user 'root'@'localhost' (using password: YES)

    这通常意味着密码错误,或者 root 用户没有从本地连接的权限,请检查你的 MySQL 用户配置。

  3. 失败(未知数据库):

    mysql_real_connect() failed: Unknown database 'test_db'

    这表示你指定的数据库名不存在,请先在 MySQL 中创建该数据库。

  4. 失败(库找不到):

    /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 查询,对于 SELECTSHOWDESCRIBE 等返回结果集的查询,它只执行查询,不获取数据。
mysql_store_result() 从服务器获取完整的结果集并存储在客户端,适用于结果集不大的情况。
mysql_use_result() 逐行获取结果集,不一次性全部加载到内存,适用于结果集非常大的情况,但会占用服务器资源。
mysql_fetch_row() 从结果集中获取下一行数据,每次调用返回一个 MYSQL_ROW
-- 展开阅读全文 --
头像
{dede:field.imgurls/}标签如何调用多张图片?
« 上一篇 2025-11-28
{dede:field.typeurl/} 是什么标签?
下一篇 » 2025-11-28

相关文章

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

目录[+]