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++深入探究哈希表如何封装出unordered_set和unordered_map

    C++深入探究哈希表如何封装出unordered_set和unordered_map

    哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方,说起来可能感觉有点复杂,我想我举个例子你就会明白了,最典型的的例子就是字典
    2022-06-06
  • 树存储结构的几种表示方法

    树存储结构的几种表示方法

    今天小编就为大家分享一篇关于树存储结构的几种表示方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • C语言不用链表完成学生管理系统(完整代码)

    C语言不用链表完成学生管理系统(完整代码)

    这篇文章主要介绍了C语言不用链表完成学生管理系统(完整代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • C++11 尾随返回类型的实现示例

    C++11 尾随返回类型的实现示例

    C++11 引入的尾随返回类型是一个强大的特性,它为开发者提供了更加灵活和清晰的方式来声明函数的返回类型,下面就来介绍一下尾随返回类型,感兴趣的可以了解一下
    2025-06-06
  • C++ boost scoped_ptr智能指针详解

    C++ boost scoped_ptr智能指针详解

    智能指针是一种像指针的C++对象,但它能够在对象不使用的时候自己销毁掉。虽然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷贝和赋值操作),因此很少有人使用。它是Boost各组件中,应用最为广泛的一个
    2022-11-11
  • 深入第K大数问题以及算法概要的详解

    深入第K大数问题以及算法概要的详解

    本篇文章是对第K大数问题以及算法概要进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++中套接字库sockpp的使用详解

    C++中套接字库sockpp的使用详解

    sockpp是一个开源、简单、现代的C++套接字库,这篇文章主要为大家详细介绍一下套接字库sockpp的使用,文中的示例代码讲解详细,感兴趣的小伙伴可以学习一下
    2023-11-11
  • C++ 数据结构超详细讲解单链表

    C++ 数据结构超详细讲解单链表

    这篇文章主要介绍了C++数据结构之单链表,链表是由一个个结点链结成的。结点包括数据域和指针域两部分,数据域用来存储数据元素的信息,指针域用来存储下一个结点的地址,更详细内容请需要的小伙伴参考下面文章内容
    2022-03-03
  • Qt实现实时鼠标绘制图形

    Qt实现实时鼠标绘制图形

    这篇文章主要介绍了Qt中QGraphicsView架构下如何实现实时鼠标绘制图形,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试
    2022-02-02
  • C语言实现求解最小公倍数的算法示例

    C语言实现求解最小公倍数的算法示例

    这篇文章主要为大家介绍了C语言如何实现求解任意两个正整数的最小公倍数,文中采用了穷举法和定理法。感兴趣的小伙伴快来跟随小编一起学习学习吧
    2021-12-12

最新评论