当前位置: 首页 > news >正文

`MYSQL`、`MYSQL_RES` 和 `MYSQL_FIELD`的含义与使用案例

在 MySQL C API 中,MYSQLMYSQL_RESMYSQL_FIELD 是三个核心数据结构,分别代表数据库连接、查询结果集和字段元数据。以下是它们的详细解释:


1. MYSQL - 数据库连接句柄

作用:表示与 MySQL 服务器的连接,是操作数据库的入口点。

关键属性和操作

typedef struct st_mysql {NET net;                 // 网络连接信息char *host;              // 服务器主机名char *user;              // 用户名char *passwd;            // 密码char *db;                // 当前数据库unsigned int port;       // 端口号unsigned long client_flag; // 连接标志// ... 其他内部状态字段
} MYSQL;

常用操作函数

MYSQL *mysql = mysql_init(NULL);                   // 初始化连接
mysql_real_connect(mysql, "host", "user", "pass", "db", port, NULL, 0); // 建立连接
mysql_query(mysql, "SELECT * FROM table");         // 执行查询
mysql_close(mysql);                                // 关闭连接

2. MYSQL_RES - 查询结果集

作用:表示 SELECTSHOW 等查询返回的结果集。

关键属性和操作

typedef struct st_mysql_res {uint64_t row_count;     // 结果集中的行数MYSQL_FIELD *fields;    // 字段元数据数组MYSQL_DATA *data;       // 结果数据// ... 其他内部字段
} MYSQL_RES;

常用操作函数

MYSQL_RES *result = mysql_store_result(mysql);    // 获取完整结果集
// 或
MYSQL_RES *result = mysql_use_result(mysql);      // 获取流式结果集int num_fields = mysql_num_fields(result);        // 获取字段数量
long long num_rows = mysql_num_rows(result);      // 获取行数MYSQL_ROW row = mysql_fetch_row(result);          // 获取一行数据
mysql_free_result(result);                        // 释放结果集

3. MYSQL_FIELD - 字段元数据

作用:描述结果集中每个字段的结构信息(列定义)。

关键属性

typedef struct st_mysql_field {char *name;                // 字段名char *org_name;            // 原始字段名char *table;               // 所属表名char *org_table;           // 原始表名char *db;                  // 所属数据库char *catalog;             // 目录名char *def;                 // 默认值unsigned long length;      // 字段长度unsigned long max_length;  // 结果集中的最大长度unsigned int name_length;unsigned int org_name_length;unsigned int table_length;unsigned int org_table_length;unsigned int db_length;unsigned int catalog_length;unsigned int def_length;unsigned int flags;        // 字段标志(NOT NULL、PRIMARY KEY等)unsigned int decimals;     // 小数位数unsigned int charsetnr;    // 字符集编号enum enum_field_types type; // 字段类型
} MYSQL_FIELD;

常用操作函数

MYSQL_FIELD *fields = mysql_fetch_fields(result);  // 获取所有字段信息
unsigned int num_fields = mysql_num_fields(result);for (int i = 0; i < num_fields; i++) {printf("Field %d: %s (Type: %d)\n", i, fields[i].name, fields[i].type);
}

三者的工作关系

执行查询
包含
包含
MYSQL
MYSQL_RES
MYSQL_FIELD 数组
MYSQL_ROW 数据
  1. 连接阶段:通过 MYSQL 对象建立连接
  2. 查询阶段:执行 SQL 语句
  3. 结果处理
    • 通过 MYSQL_RES 获取结果集
    • 通过 MYSQL_FIELD 获取字段结构信息
    • 通过 mysql_fetch_row() 获取实际数据行

完整使用示例

#include <mysql/mysql.h>
#include <stdio.h>int main() {MYSQL *conn = mysql_init(NULL);if (!mysql_real_connect(conn, "localhost", "user", "pass", "db", 0, NULL, 0)) {fprintf(stderr, "连接失败: %s\n", mysql_error(conn));return 1;}// 执行查询if (mysql_query(conn, "SELECT id, name, email FROM users")) {fprintf(stderr, "查询失败: %s\n", mysql_error(conn));return 1;}// 获取结果集MYSQL_RES *result = mysql_store_result(conn);if (!result) {fprintf(stderr, "获取结果集失败: %s\n", mysql_error(conn));return 1;}// 获取字段信息MYSQL_FIELD *fields = mysql_fetch_fields(result);int num_fields = mysql_num_fields(result);// 打印表头for (int i = 0; i < num_fields; i++) {printf("%-15s", fields[i].name);}printf("\n------------------------------------------------\n");// 打印数据MYSQL_ROW row;while ((row = mysql_fetch_row(result))) {for (int i = 0; i < num_fields; i++) {printf("%-15s", row[i] ? row[i] : "NULL");}printf("\n");}// 清理资源mysql_free_result(result);mysql_close(conn);return 0;
}

字段类型常量(部分)

常量名对应 SQL 类型
MYSQL_TYPE_TINY1TINYINT
MYSQL_TYPE_SHORT2SMALLINT
MYSQL_TYPE_LONG3INT
MYSQL_TYPE_FLOAT4FLOAT
MYSQL_TYPE_DOUBLE5DOUBLE
MYSQL_TYPE_STRING254CHAR/VARCHAR
MYSQL_TYPE_BLOB252BLOB/TEXT
MYSQL_TYPE_TIMESTAMP7TIMESTAMP
MYSQL_TYPE_DATE10DATE
MYSQL_TYPE_TIME11TIME
MYSQL_TYPE_DATETIME12DATETIME

重要注意事项

  1. 资源释放

    • 必须调用 mysql_free_result() 释放结果集
    • 必须调用 mysql_close() 关闭连接
  2. 结果集生命周期

    // 错误!result 在 if 块结束后被释放
    if (mysql_query(conn, "SELECT ...")) {MYSQL_RES *result = mysql_store_result(conn);
    }
    // 此处 result 已失效
    
  3. 二进制数据

    • 使用 mysql_real_escape_string() 处理二进制数据
    • 对于 BLOB 类型,结果以 char* 形式返回
  4. 空值处理

    if (row[i] == NULL) {// 处理空值
    }
    

掌握这三个核心结构及其关系是使用 MySQL C API 进行高效数据库开发的基础。

http://www.lryc.cn/news/594539.html

相关文章:

  • [硬件电路-59]:电源:电子存储的仓库,电能的发生地,电场的动力场所
  • 2025最新 PostgreSQL17 安装及配置(Windows原生版)
  • BST(二叉搜索树)的笔试大题(C语言)
  • 【web安全】SQL注入与认证绕过
  • 【算法300题】:双指针
  • c#转python第四天:生态系统与常用库
  • XSS的介绍
  • Linux主机 ->多机器登录
  • 从零到精通:用DataBinding解锁MVVM的开发魔法
  • 【JS逆向基础】数据库之MongoDB
  • Django接口自动化平台实现(四)
  • SpringBoot的配置文件
  • 测试学习之——Pytest Day4
  • WPF学习笔记(28)Interaction.Triggers的意义与使用方式
  • 人工智能之数学基础:随机实验、样本空间、随机事件
  • 均值漂移累积监测算法(MDAM):原理、命名、用途及实现
  • 爬虫实战案例(两个)
  • 【Lua】大G表
  • Linux 基本指令详解
  • 【论文研读】SlowFast Networks for Video Recognition
  • 大语言模型调用方式与函数调用
  • 从磁记录到数据中心:磁盘原理与服务器架构的完整技术链路
  • CVE-2022-41128
  • 六边形滚动机器人cad【7张】三维图+设计书明说
  • 从零搭建智能搜索代理:LangGraph + 实时搜索 + PDF导出完整项目实战
  • 【超越VGGT】π3-利用置换等变方法去除3r系列的归纳偏置
  • TypeScript 中替代 Interface 的方案
  • 一文速通《二次型》
  • UE5多人MOBA+GAS 26、为角色添加每秒回血回蓝(番外:添加到UI上)
  • 图的表示法以及实现