MySQL C API 使用指南
1. 概述
MySQL C API 是用于C语言程序与MySQL数据库交互的接口库,提供了连接管理、SQL执行、结果集处理等功能。本指南将帮助你快速入门并使用MySQL C API。
2. 环境准备
2.1 头文件与库
- 头文件:
#include <mysql.h> - 编译链接:
-lmysqlclient
2.2 编译示例
gcc your_program.c -I/usr/include/mysql -lmysqlclient -o your_program3. 核心结构体
3.1 MYSQL 结构体
功能:代表一个数据库连接句柄,包含服务器连接状态信息
定义:MYSQL mysql;
用途:几乎所有MySQL函数都需要用到这个结构体
3.2 MYSQL_RES 结构体
功能:存储查询结果集(SELECT、SHOW、DESCRIBE等命令的返回结果)
定义:MYSQL_RES *res;
用途:用于获取和处理查询结果
3.3 MYSQL_ROW 结构体
功能:代表结果集中的一行数据
定义:MYSQL_ROW row;
实现:本质是一个字符串数组(char**),每个元素对应一列数据
用途:用于遍历结果集中的数据行
4. 函数接口
4.1 连接/断开服务器
mysql_init
功能:初始化MYSQL结构体
原型:MYSQL *mysql_init(MYSQL *mysql);
参数:
mysql:MYSQL结构体指针(NULL表示创建新结构体)
返回值:初始化后的MYSQL指针,失败返回NULL
示例:MYSQL mysql; mysql_init(&mysql);
mysql_real_connect
功能:建立与MySQL服务器的连接
原型:MYSQL *STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag);
参数:
mysql:MYSQL结构体指针host:服务器地址(NULL表示localhost)user:用户名passwd:密码db:数据库名(NULL表示不选择数据库)port:端口号(0表示默认3306)unix_socket:Unix套接字(NULL表示不使用)clientflag:客户端标志(0表示默认)
返回值:成功返回mysql指针,失败返回NULL
示例:MYSQL mysql; mysql_init(&mysql); //mysql_real_connect(MYSQL *,("192.168.1.44","root","123456","",3306,NULL,0) if(!mysql_real_connect(&mysql, 0, "root", "123456", NULL, 0, NULL, 0)) { printf("connet failed\n"); exit(1); } printf("connect success!\n\n"); //选择数据库 mysql_select_db(&mysql, "stu_system");
mysql_select_db
功能:选择当前数据库
原型:int mysql_select_db(MYSQL *mysql, const char *db);
参数:
mysql:MYSQL结构体指针db:数据库名
返回值:成功返回0,失败返回非0
示例:mysql_select_db(&mysql, "stu_system");
mysql_close
功能:关闭与MySQL服务器的连接
原型:void mysql_close(MYSQL *mysql);
参数:
mysql:MYSQL结构体指针
返回值:无
示例:mysql_close(&mysql);
4.2 执行SQL语句
mysql_query
功能:执行以null结尾的字符串指向的SQL语句
原型:int mysql_query(MYSQL *mysql, const char *query);
参数:
mysql:MYSQL结构体指针query:SQL语句字符串
返回值:成功返回0,失败返回非0
示例:char query[1024]; memset(query, 0, sizeof(query)); //创建数据库 strcpy(query,"create database student_info"); mysql_query(&mysql, query); //选择数据库 mysql_select_db(&mysql, "student_info"); //创建数据表 memset(query, 0, sizeof(query)); //这一块初始化为0 strcpy(query,"create table login_info(id varchar(10) not null,pwd varchar(10) not null)"); mysql_query(&mysql, query); //执行查表 memset(query, 0, sizeof(query)); strcpy(query,"select * from login_info"); if(mysql_query(&mysql, query)) { printf("select failed\n"); exit(1); }
mysql_real_query
功能:执行指向的SQL语句,字符串length字节长
原型:int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length);
参数:
mysql:MYSQL结构体指针query:SQL语句字符串length:SQL语句长度
返回值:成功返回0,失败返回非0
示例:char query[1024] = "select * from login_info"; if(mysql_real_query(&mysql, query, strlen(query))) { printf("select failed\n"); exit(1); }
4.3 获取检索结果及释放
mysql_store_result
功能:检索完整的"结果集"至客户端
原型:MYSQL_RES *mysql_store_result(MYSQL *mysql);
参数:
mysql:MYSQL结构体指针
返回值:成功返回MYSQL_RES指针,失败返回NULL
示例:if(mysql_query(&mysql, query)) { printf("select failed\n"); exit(1); } MYSQL_RES *res = mysql_store_result(&mysql);
mysql_free_result
功能:释放检索结果
原型:void mysql_free_result(MYSQL_RES *result);
参数:
result:MYSQL_RES结构体指针
返回值:无
示例:mysql_free_result(res);
4.4 结果集中列操作
mysql_num_fields
功能:从结果集中统计表的字段个数(列数)
原型:unsigned int mysql_num_fields(MYSQL_RES *result);
参数:
result:MYSQL_RES结构体指针
返回值:字段个数
示例:unsigned short numFields; numFields = mysql_num_fields(res); printf("%d\n", numFields);
mysql_fetch_field
功能:从结果集中获取表的字段结构体
原型:MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);
参数:
result:MYSQL_RES结构体指针
返回值:MYSQL_FIELD指针,按左到右顺序读取
示例:char column[30][40]; for(int i = 0; i < numFields; ++i) { strcpy(column[i], mysql_fetch_field(res)->name); printf("%s ", column[i]); } printf("\n");
4.5 结果集中行操作
mysql_num_rows
功能:返回结果集中的行数(记录数)
原型:my_ulonglong mysql_num_rows(MYSQL_RES *result);
参数:
result:MYSQL_RES结构体指针
返回值:行数
示例:if(mysql_num_rows(res)) { // 处理结果集 }
mysql_fetch_row
功能:从结果集中获取下一行数据
原型:MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
参数:
result:MYSQL_RES结构体指针
返回值:成功返回MYSQL_ROW指针,失败或无更多行返回NULL
示例:MYSQL_ROW row; //获取并打印每一行的内容 while( (row = mysql_fetch_row(res)) != NULL ) { for(int j=0; j<numFields; j++) { printf("%s = %s ", column[j], row[j]); } printf("\n"); } //再例: if(mysql_num_rows(res)) { while(row = mysql_fetch_row(res)) { if(strcmp(lid, row[0]) == 0) { printf("id exist!\n"); mysql_free_result(res); } } }