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

 更新时间:2026年05月21日 08:37:00   作者:重生之小比特  
本文详细介绍了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. 库文件作用(必看)

  • include:告诉编译器有哪些函数可以调用
  • lib:告诉链接器函数的实现在哪里
  • 核心库:libmysqlclient(动态库 .so / 静态库 .a

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

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

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

参数说明:

  • -I./include:指定头文件路径
  • -L./lib:指定库文件路径
  • -lmysqlclient:链接 libmysqlclient

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 操作句柄(必须第一步)
  • 传 NULL:自动分配空间
  • 返回值:成功返回 MYSQL* 句柄,失败 NULL

示例:

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);
  • 作用:下发 SQL 语句(增删改查都用它)
  • 返回 0 成功,非 0 失败

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

  • mysql_store_result(MYSQL*):把结果读到内存
  • mysql_num_rows(MYSQL_RES*):获取结果行数
  • mysql_num_fields(MYSQL_RES*):获取列数
  • mysql_fetch_fields(MYSQL_RES*):获取列名
  • mysql_fetch_row(MYSQL_RES*):逐行获取数据

特别注意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数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解C++模板编程中typename用法

    详解C++模板编程中typename用法

    typename在C++类模板或者函数模板中经常使用的关键字,此时作用和class相同,只是定义模板参数,下面通过例子给大家介绍c++模板typename的具体用法,一起看看吧
    2021-07-07
  • 浅谈使用C++多级指针存储海量qq号和密码

    浅谈使用C++多级指针存储海量qq号和密码

    这篇文章主要介绍了浅谈使用C++多级指针存储海量qq号和密码,分享了相关实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • C语言动态规划点杀dp算法LeetCode炒股习题案例解析

    C语言动态规划点杀dp算法LeetCode炒股习题案例解析

    这篇文章主要介绍为了C语言动态规划点杀dp算法,本文以LeetCode炒股习题案例来为大家进行详细解析,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-02-02
  • C++实现主机字节序和网络字节序转换示例

    C++实现主机字节序和网络字节序转换示例

    这篇文章主要为大家介绍了C++实现主机字节序和网络字节序转换示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • C++获取字符串最后一个单词长度的多种方法

    C++获取字符串最后一个单词长度的多种方法

    在字符串处理中,获取最后一个单词的长度是一个常见问题,这个问题在文本处理、编译原理、自然语言处理等领域都有广泛应用,本文将详细介绍多种解决该问题的方法,并分析各自的优缺点,需要的朋友可以参考下
    2026-03-03
  • C语言细致讲解线程同步的集中方式

    C语言细致讲解线程同步的集中方式

    多线程中的线程同步可以使用,CreateThread,CreateMutex 互斥锁实现线程同步,通过临界区实现线程同步,Semaphore 基于信号实现线程同步,CreateEvent 事件对象的同步,以及线程函数传递单一参数与多个参数的实现方式
    2022-05-05
  • C语言学习之指针知识总结

    C语言学习之指针知识总结

    想突破C语言的学习,对指针的掌握是非常重要的,本文为大家总结了C语言中指针的相关知识点,文中的示例代码讲解详细,感兴趣的可以学习一下
    2022-07-07
  • C++基于EasyX框架实现飞机大战小游戏

    C++基于EasyX框架实现飞机大战小游戏

    EasyX是针对C/C++的图形库,可以帮助使用C/C++语言的程序员快速上手图形和游戏编程。本文将利用EasyX框架实现飞机大战小游戏,需要的可以参考一下
    2023-01-01
  • C++、python和go语言实现的简单客户端服务器代码示例

    C++、python和go语言实现的简单客户端服务器代码示例

    这篇文章主要介绍了C++、python和go语言实现的简单客户端服务器代码示例,本文分别给出了3种语言的客户端服务器通信代码实例,需要的朋友可以参考下
    2015-03-03
  • 深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下
    2013-05-05

最新评论