网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
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 */
unsigned int decimals; /* Number of decimals in field */
} MYSQL_FIELD; //列信息的结构
mysql_store_result
MYSQL_RES *mysql_store_result(MYSQL *mysql);
mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构。
如果查询未返回结果集,mysql_store_result()将返回NULL指针。
如果读取结果集失败,mysql_store_result()也会返回NULL指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。
mysql_use_result
MYSQL_RES *mysql_use_result(MYSQL *mysql);
//如果出现错误,返回NULL。
mysql_use_result()将结果保存在服务器,它必须通过对mysql_fetch_row()的调用,对每一行分别进行检索。与mysql_store_result()相比,速度更快而且使用的内存也更少。
另一方面,这会绑定服务器,并阻止其他线程更新任何表(确实,我试过,在free之前无法执行任何命令)。
如果你正在客户端一侧为各行进行大量的处理操作,就不应使用mysql_use_result()。
一旦完成了对结果集的操作,必须调用mysql_free_result()。
mysql_fetch_row
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
JN4YcP-1715835322253)]
[外链图片转存中…(img-QFUtPsWA-1715835322253)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!