C语言连接MySQL数据库的完整流程
大家好,最近在学习数据库编程,今天把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++、python和go语言实现的简单客户端服务器代码示例
这篇文章主要介绍了C++、python和go语言实现的简单客户端服务器代码示例,本文分别给出了3种语言的客户端服务器通信代码实例,需要的朋友可以参考下2015-03-03


最新评论