2024年最新关于 C++ 操作 MySQL 数据查询的底层数据结构与函数支持(1),Kotlin可能带来的一个深坑

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • MYSQL_FIELD

  • 相关API

    • mysql_store_result
  • mysql_use_result

  • mysql_fetch_row

  • mysql_fetch_field

  • mysql_free_result

近况


这些天,一半的时间都花在练车了,导致毕设进度就慢下来了。而且最近完美主义越来越严重,就加了个调优的小版本。本来今天应该进入第二个阶段了(主redis),结果现在还在对第一个版本进行调优。所以目前还是主mysql。

写了这么多天的mysql代码,不敢说很熟练,但是有件事情一定要做一下,那就是把“本质”拿出来晾晒晾晒,不能天天稀里糊涂的调API吧(确实稀里糊涂,因为没有看过API的源码)


示例函数


先来段函数示例吧,放码过去:

MySQL是我封装的一个类,函数名没改动,原滋原味。

MySQL mysql;

if (mysql.connect())

{

MYSQL_RES *res = mysql.query(sql1); //first blood

if (res != nullptr)

{

···

int num_fields = mysql_num_fields(res); //注

//double kill

MYSQL_ROW row = mysql_fetch_row(res); //mysql_fetch_row()毎执行一次,都从资源也就是结果集中依次取一条数据,

//以数组的形式返回出来,当前一次取得最后一条数据,返回空结果。

//返回数组都是一维索引数组,每一个下标与数据库的排序一一对应

while (row != nullptr)

{

for (int i = 0; i < num_fields; i++)

{

···

}

row = mysql_fetch_row(res); //注

}

mysql_free_result(res); //注

}

}

// 查询操作

MYSQL_RES *MySQL::query(string sql)

{

if (mysql_query(_conn, sql.c_str()))

{

LOG_INFO << FILE << “:” << LINE << “:” << sql << “查询失败!”;

cout << mysql_error(_conn) << endl;

return nullptr;

}

return mysql_use_result(_conn);

}

这里面涉及了一些,在mysql查询中常用的数据结构和函数,如果对其构成不清楚明了的话,用起来那可不就是稀里糊涂嘛!!!


数据结构


MYSQL_RES

这是一个用于存放mysql结果集的数据结构。这么讲没意思,直接看构成:

typedef struct st_mysql_res {

my_ulonglong row_count; // 结果集的行数

unsigned int field_count, current_field; // 结果集的列数,当前列

MYSQL_FIELD *fields; // 结果集的列信息

MYSQL_DATA *data; // 结果集的数据

MYSQL_ROWS *data_cursor; // 结果集的光标

MEM_ROOT field_alloc; // 内存结构

MYSQL_ROW row; // 非缓冲的时候用到

MYSQL_ROW current_row; // mysql_store_result时会用到。当前行

unsigned long *lengths; // 每列的长度

MYSQL *handle; // mysql_use_result会用。

my_bool eof; // 是否为行尾

} MYSQL_RES;

这里面就有我们很关心的:行数、列数、数据。


MYSQL_DATA

typedef struct st_mysql_data {

my_ulonglong rows;

unsigned int fields;

MYSQL_ROWS *data;

MEM_ROOT alloc;

} MYSQL_DATA; // 数据集的结构


MYSQL_ROWS

typedef struct st_mysql_rows {

struct st_mysql_rows next; / list of rows */

MYSQL_ROW data;

} MYSQL_ROWS; //mysql的数据的链表节点。

MYSQL_ROW

typedef char** MYSQL_ROW; /* 返回的每一行的值,全部用字符串来表示*/


MYSQL_FIELD

typedef struct st_mysql_field {

char name; / Name of column */

char table; / Table of column if column was a field */

char def; / Default value (set by mysql_list_fields) */

enum enum_field_types type; /* Type of field. Se mysql_com.h for types */

unsigned int length; /* Width of column */

unsigned int max_length; /* Max width of selected set */

unsigned int flags; /* Div flags */

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

rWQLVN-1715668684343)]
[外链图片转存中…(img-3gY74vaJ-1715668684343)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 29
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值