C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C语言连接MySQL数据库

C语言连接MySQL数据库的完整流程

作者:重生之小比特

本文详细介绍了C语言连接MySQL数据库的完整流程,从库文件配置,编译运行,再到 API 函数详解和完整代码实战,感兴趣的小伙伴可以跟随小编一起学习一下

大家好,最近在学习数据库编程,今天把C 语言连接 MySQL的完整流程整理成一篇超详细博客,从库文件配置、编译运行,到 API 函数详解、完整代码实战,一步一步带你上手,新手也能直接跟着做!

一、前言:为什么用 C 语言连接 MySQL?

MySQL 官方提供了 C 语言原生 API(Connector/C),这是所有语言(Python/Java/PHP)连接 MySQL 的底层基础,性能最高、可控性最强,非常适合:

本文完全基于官方库,不依赖第三方封装,可直接编译运行

二、环境准备:Connector/C 库下载与结构

1. 下载官方库

前往 MySQL 官网下载 Connector/C

选择对应系统版本(Linux 64 位 / Windows),下载后解压得到两个核心目录:

mysql-connector-c/
├── include/  # 头文件:所有函数声明(mysql.h 等)
└── lib/      # 库文件:函数实现(.so / .a)

2. 库文件作用(必看)

三、第一步:验证库引入成功(最简测试)

在写复杂连接前,先做最小验证,确保环境配置正确。

1. 测试代码(test.c)

#include <stdio.h>
#include <mysql.h>  // 必须包含 MySQL 核心头文件

int main() {
    // 获取客户端库版本
    const char* version = mysql_get_client_info();
    printf("MySQL Client Version: %s\n", version);
    return 0;
}

2. 编译命令(关键)

gcc -o test test.c -I./include -L./lib -lmysqlclient

参数说明:

3. 运行与动态库问题解决

直接运行可能报错:

error while loading shared libraries: libmysqlclient.so.18

原因:系统找不到动态库,临时设置环境变量

export LD_LIBRARY_PATH=./lib
./test

成功输出:

MySQL Client Version: 6.1.6

库引入成功!

四、MySQL C API 核心函数全解

C 语言操作 MySQL 固定5 步流程

初始化 → 2. 连接数据库 → 3. 执行 SQL → 4. 获取结果 → 5. 关闭连接

1. 初始化:mysql_init

MYSQL* mysql_init(MYSQL* mysql);

示例:

MYSQL* mysql = mysql_init(NULL);
if (mysql == NULL) {
    printf("初始化失败\n");
    return 1;
}

2. 建立连接:mysql_real_connect

MYSQL* mysql_real_connect(
    MYSQL* mysql,
    const char* host,      // 主机:localhost / 127.0.0.1
    const char* user,      // 用户名:root
    const char* passwd,    // 密码
    const char* db,        // 要连接的数据库名
    unsigned int port,     // 端口:3306
    const char* unix_socket,// NULL
    unsigned long clientflag// 0
);

连接成功后必须设置字符集,否则中文乱码:

mysql_set_character_set(mysql, "utf8");

3. 执行 SQL:mysql_query

int mysql_query(MYSQL* mysql, const char* sql);

4. 获取查询结果(SELECT 专用)

特别注意MYSQL_RES* 是 malloc 申请的空间,必须手动释放,否则内存泄漏!

MYSQL_RES* result = mysql_store_result(mysql);
// ... 使用结果
mysql_free_result(result);

5. 关闭连接:mysql_close

mysql_close(mysql);

五、完整实战代码:连接 + 查询 + 打印

直接复制可用,替换自己的数据库信息即可运行!

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <mysql.h>

int main() {
    // 1. 初始化
    MYSQL* mysql = mysql_init(NULL);
    if (mysql == NULL) {
        printf("mysql_init 失败\n");
        return 1;
    }

    // 2. 连接数据库(请修改为你的信息)
    const char* host = "localhost";
    const char* user = "root";
    const char* passwd = "123456";
    const char* db = "test";
    unsigned int port = 3306;

    if (mysql_real_connect(mysql, host, user, passwd, db, port, NULL, 0) == NULL) {
        printf("连接失败: %s\n", mysql_error(mysql));
        mysql_close(mysql);
        return 1;
    }
    printf("数据库连接成功 ✅\n");
    mysql_set_character_set(mysql, "utf8");

    // 3. 执行查询 SQL
    const char* sql = "SELECT id, name, age FROM student;";
    if (mysql_query(mysql, sql) != 0) {
        printf("查询失败: %s\n", mysql_error(mysql));
        mysql_close(mysql);
        return 1;
    }

    // 4. 获取结果
    MYSQL_RES* res = mysql_store_result(mysql);
    if (res == NULL) {
        printf("无结果或执行失败\n");
        mysql_close(mysql);
        return 1;
    }

    // 列数、列名
    int fields = mysql_num_fields(res);
    MYSQL_FIELD* field = mysql_fetch_fields(res);
    for (int i = 0; i < fields; i++) {
        printf("%s\t", field[i].name);
    }
    printf("\n----------------------------------------\n");

    // 逐行打印
    MYSQL_ROW row;
    while ((row = mysql_fetch_row(res)) != NULL) {
        for (int i = 0; i < fields; i++) {
            printf("%s\t", row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }

    // 5. 释放资源 + 关闭
    mysql_free_result(res);
    mysql_close(mysql);
    printf("\n操作完成 ✅\n");
    return 0;
}

六、编译运行命令

gcc -o mysql_demo mysql_demo.c -I./include -L./lib -lmysqlclient
export LD_LIBRARY_PATH=./lib
./mysql_demo

七、常见问题汇总(避坑指南)

1.中文乱码

连接成功后必须加:

mysql_set_character_set(mysql, "utf8");

2.动态库找不到

export LD_LIBRARY_PATH=./lib

3.连接失败 Access denied

检查 host、user、password、port、db 是否正确

4.内存泄漏

MYSQL_RES* 必须 mysql_free_result

八、扩展:事务支持(非常重要)

MySQL C API 原生支持事务:

mysql_autocommit(mysql, 0);  // 关闭自动提交
// 执行多条 SQL...
mysql_commit(mysql);         // 提交
// 出错则回滚
mysql_rollback(mysql);

九、总结

C 语言连接 MySQL 其实非常简单,记住固定流程:初始化 → 连接 → 执行 SQL → 获取结果 → 释放关闭。

到此这篇关于C语言连接MySQL数据库的完整流程的文章就介绍到这了,更多相关C语言连接MySQL数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文