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_program

3. 核心结构体

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);
          }
      }
    }