MySQL Connect1.连接2.连接数据库3.selecthello各位读者大大们你们好呀系列专栏【MySQL的学习】本篇内容连接连接数据库select⬆⬆⬆⬆上一篇MySQL之用户管理作者简介轩情吖请多多指教( •̀֊•́ ) ̖́-1.连接在工作中我们一般性都是使用程序来执行MySQL因此我们需要将C和MySQL链接起来因此我们需要特定的库来建立他们的链接。在我们进行安装的时候我们可以从官网上下载相应的安装包然后放到Linux中进行解压在编译代码的时候进行连接动态库。但是其实还有一种情况那就是我们在安装MySQL的时候它就自动给我们下载了。当然不同的系统和版本会有出入有的系统可能头文件和动态库都有有的系统会缺少头文件就像我的Ubuntu中就却少了头文件因此我们需要下载一下如下图我们可以看一下我们的头文件和库在哪里现在我们准备测试一下我们的MySQL Client通过mysql_get_client_info()函数来验证我们的引入是否成功我们的编译器能够找到我们的头文件位置但是mysql.h是在mysql目录下需要写清楚头文件路径-I和库路径-L可省略因为 MySQL 的头文件 / 库文件安装在 gcc 的默认搜索路径/usr/include/、/usr/lib/x86_64-linux-gnu/里编译器会自动查找。库名-l必须指定因为系统默认路径里有大量库编译器无法判断你需要链接哪个库必须明确指定 MySQL 对应的 mysqlclient 库名。2.连接数据库接下来就是要正式的连接我们的我们的数据库然后使用SQL语句进行交互可以参考MySQL的文档首先我们需要先在MySQL中创建一个用户并给他权限我们可以再创建一个库专门用来给这个用户使用MySQL C API 核心函数函数名函数原型核心作用关键参数说明重点返回值说明mysql_initMYSQL *mysql_init(MYSQL *mysql);初始化 MySQL 连接句柄为后续连接做准备mysql通常传NULL由函数自动分配并初始化连接对象成功返回初始化后的MYSQL*句柄失败返回NULLmysql_real_connectMYSQL *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 client_flag);与 MySQL 服务器建立实际连接TCP/IP 或 Unix 套接字mysqlmysql_init返回的连接句柄host服务器地址localhost/IPuser登录用户名如rootpasswd用户密码db默认连接的数据库名可传NULLport端口号默认3306传0用默认unix_socketUnix 套接字路径本地连接用传NULL用默认client_flag连接选项一般传0成功返回与传入参数相同的MYSQL*句柄失败返回NULL可通过mysql_error()获取错误信息mysql_queryint mysql_query(MYSQL *mysql, const char *q);向服务器发送一条 SQL 语句不支持含二进制数据的语句mysql已连接的句柄q要执行的 SQL 字符串如SELECT * FROM table成功返回0失败返回非0mysql_closevoid mysql_close(MYSQL *mysql);关闭与 MySQL 服务器的连接并释放相关资源mysql要关闭的连接句柄需是已初始化/连接成功的句柄无返回值void调用后句柄失效不可再使用第一个参数 MYSQL是 C api中一个非常重要的变量mysql_init的返回值里面内存非常丰富有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量该变量 里面保存着很多函数指针这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。#includeiostream#includemysql/mysql.h#includestringusingnamespacestd;intmain(){// //用来查看MySQL版本// std::coutmysql client version:mysql_get_client_info()std::endl;//初始化库MYSQL*mysmysql_init(nullptr);if(mysnullptr){cerrinit mysql failedendl;return1;}//连接数据库mysmysql_real_connect(mys,127.0.0.1,Jack,密码这边省略,conn,端口号这边省略,nullptr,0);if(mysnullptr){cerrconnect mysql failedendl;return2;}//SQL语句下发string sql;while(true){coutmysql;if(!getline(cin,sql)||sqlquit){return3;}//返回0成功intretmysql_query(mys,sql.c_str());if(ret0){coutSQL query success:retendl;}else{coutSQL query failedretendl;return4;}}//关闭MySQL连接mysql_close(mys);return0;}这里在有的版本中能插入成功但是是乱码建立好链接之后获取英文没有问题这是编码问题因此设置链接的字符集是utf8原始默认是latin1并且我们此时也可以通过SQL语句来查看当前的连接情况3.select接下里要讲的查就比较特殊了我们可以看一下我们输入这个SQL语句会怎样可以看到我们的SQL语句执行成功了但是我们看不到内容啊这该怎么办MySQL C API 结果集操作函数速查表函数名函数原型核心作用关键参数说明返回值说明注意事项mysql_store_resultMYSQL_RES *mysql_store_result(MYSQL *mysql);从服务器获取查询结果集将全部结果加载到客户端内存mysql已执行查询的连接句柄成功返回 MYSQL_RES* 结果集指针失败/无结果返回 NULL需调用 mysql_free_result 释放结果集mysql_num_rowsmy_ulonglong mysql_num_rows(MYSQL_RES *res);获取结果集中的总行数res结果集指针返回无符号长整型的总行数仅在 mysql_store_result 后有效mysql_num_fieldsunsigned int mysql_num_fields(MYSQL_RES *res);获取结果集中的总列数res结果集指针返回无符号整型的总列数列数与查询字段数量一致mysql_fetch_fieldsMYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);获取所有列的元信息字段名/类型/长度等res结果集指针返回 MYSQL_FIELD* 数组指针长度总列数可通过下标访问列信息如 field[i].namemysql_fetch_rowMYSQL_ROW mysql_fetch_row(MYSQL_RES *result);从结果集中逐行读取数据每次获取下一行result结果集指针成功返回 MYSQL_ROW 行数据指针读取完毕/失败返回 NULL循环读取至 NULL 结束每行按列存储数据#includeiostream#includemysql/mysql.h#includestringusingnamespacestd;intmain(){//初始化库MYSQL*mysmysql_init(nullptr);if(mysnullptr){cerrinit mysql failedendl;return1;}//连接数据库mysmysql_real_connect(mys,localhost,Jack,密码这边省略,conn,端口号省略,nullptr,0);//127.0.0.1或者localhost都可以if(mysnullptr){cerrconnect mysql failedendl;return2;}//设置编码mysql_set_character_set(mys,utf8);//SQL语句下发// string sqlinsert into t1 values(4,\Jon\,\7777777\);string sqlselect* from t1;mysql_query(mys,sql.c_str());//获取查询结果MYSQL_RES*mrsmysql_store_result(mys);if(mrsnullptr){cerrmysql store result failedendl;return3;}//获取行列introwmysql_num_rows(mrs);coutrow:rowendl;intfieldsmysql_num_fields(mrs);coutfields:fieldsendl;//获取数据的信息MYSQL_FIELD*myfieldsmysql_fetch_fields(mrs);for(inti0;ifields;i){coutmyfields[i].name ;}coutendl;//获取数据的内容for(inti0;irow;i){MYSQL_ROW myrowmysql_fetch_row(mrs);for(intj0;jfields;j){coutmyrow[j] ;}coutendl;}//释放结果集mysql_free_result(mrs);//关闭MySQL连接mysql_close(mys);return0;}接下来就要详细说说这些函数的一些情况包括他们的返回的类型都是比较重要的。sql执行完以后如果是查询语句我们当然还要读取数据如果updateinsert等语句那么就看下操作成功与否即可。获取查询结果 如果mysql_query返回成功那么我们就通过mysql_store_result这个函数来读取结果。该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据所以我们一定要记的 free(result)释放要用,不然是肯定会造成内存泄漏的。 执行完mysql_store_result以后其实数据都已经在MYSQL_RES 变量中了。因此上面的API除了mysql_store_result基本就是读取MYSQL_RES 中的数据。mysql会将所有的数据读取出来的时候全部都当成字符串因此可以理解为MYSQL_RES中有上述的结构其实也可以看成二维数组可以理解就行其实数据都变成了一个个字符串用指针被指向。MySQLConnect大概就讲到这里啦博主后续会继续更新更多Qt的相关知识干货满满如果觉得博主写的还不错的话希望各位小伙伴不要吝啬手中的三连哦如有小伙伴需要Qt的安装包可以私信我你们的支持是博主坚持创作的动力
MySQL Connect
MySQL Connect1.连接2.连接数据库3.selecthello各位读者大大们你们好呀系列专栏【MySQL的学习】本篇内容连接连接数据库select⬆⬆⬆⬆上一篇MySQL之用户管理作者简介轩情吖请多多指教( •̀֊•́ ) ̖́-1.连接在工作中我们一般性都是使用程序来执行MySQL因此我们需要将C和MySQL链接起来因此我们需要特定的库来建立他们的链接。在我们进行安装的时候我们可以从官网上下载相应的安装包然后放到Linux中进行解压在编译代码的时候进行连接动态库。但是其实还有一种情况那就是我们在安装MySQL的时候它就自动给我们下载了。当然不同的系统和版本会有出入有的系统可能头文件和动态库都有有的系统会缺少头文件就像我的Ubuntu中就却少了头文件因此我们需要下载一下如下图我们可以看一下我们的头文件和库在哪里现在我们准备测试一下我们的MySQL Client通过mysql_get_client_info()函数来验证我们的引入是否成功我们的编译器能够找到我们的头文件位置但是mysql.h是在mysql目录下需要写清楚头文件路径-I和库路径-L可省略因为 MySQL 的头文件 / 库文件安装在 gcc 的默认搜索路径/usr/include/、/usr/lib/x86_64-linux-gnu/里编译器会自动查找。库名-l必须指定因为系统默认路径里有大量库编译器无法判断你需要链接哪个库必须明确指定 MySQL 对应的 mysqlclient 库名。2.连接数据库接下来就是要正式的连接我们的我们的数据库然后使用SQL语句进行交互可以参考MySQL的文档首先我们需要先在MySQL中创建一个用户并给他权限我们可以再创建一个库专门用来给这个用户使用MySQL C API 核心函数函数名函数原型核心作用关键参数说明重点返回值说明mysql_initMYSQL *mysql_init(MYSQL *mysql);初始化 MySQL 连接句柄为后续连接做准备mysql通常传NULL由函数自动分配并初始化连接对象成功返回初始化后的MYSQL*句柄失败返回NULLmysql_real_connectMYSQL *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 client_flag);与 MySQL 服务器建立实际连接TCP/IP 或 Unix 套接字mysqlmysql_init返回的连接句柄host服务器地址localhost/IPuser登录用户名如rootpasswd用户密码db默认连接的数据库名可传NULLport端口号默认3306传0用默认unix_socketUnix 套接字路径本地连接用传NULL用默认client_flag连接选项一般传0成功返回与传入参数相同的MYSQL*句柄失败返回NULL可通过mysql_error()获取错误信息mysql_queryint mysql_query(MYSQL *mysql, const char *q);向服务器发送一条 SQL 语句不支持含二进制数据的语句mysql已连接的句柄q要执行的 SQL 字符串如SELECT * FROM table成功返回0失败返回非0mysql_closevoid mysql_close(MYSQL *mysql);关闭与 MySQL 服务器的连接并释放相关资源mysql要关闭的连接句柄需是已初始化/连接成功的句柄无返回值void调用后句柄失效不可再使用第一个参数 MYSQL是 C api中一个非常重要的变量mysql_init的返回值里面内存非常丰富有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量该变量 里面保存着很多函数指针这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。#includeiostream#includemysql/mysql.h#includestringusingnamespacestd;intmain(){// //用来查看MySQL版本// std::coutmysql client version:mysql_get_client_info()std::endl;//初始化库MYSQL*mysmysql_init(nullptr);if(mysnullptr){cerrinit mysql failedendl;return1;}//连接数据库mysmysql_real_connect(mys,127.0.0.1,Jack,密码这边省略,conn,端口号这边省略,nullptr,0);if(mysnullptr){cerrconnect mysql failedendl;return2;}//SQL语句下发string sql;while(true){coutmysql;if(!getline(cin,sql)||sqlquit){return3;}//返回0成功intretmysql_query(mys,sql.c_str());if(ret0){coutSQL query success:retendl;}else{coutSQL query failedretendl;return4;}}//关闭MySQL连接mysql_close(mys);return0;}这里在有的版本中能插入成功但是是乱码建立好链接之后获取英文没有问题这是编码问题因此设置链接的字符集是utf8原始默认是latin1并且我们此时也可以通过SQL语句来查看当前的连接情况3.select接下里要讲的查就比较特殊了我们可以看一下我们输入这个SQL语句会怎样可以看到我们的SQL语句执行成功了但是我们看不到内容啊这该怎么办MySQL C API 结果集操作函数速查表函数名函数原型核心作用关键参数说明返回值说明注意事项mysql_store_resultMYSQL_RES *mysql_store_result(MYSQL *mysql);从服务器获取查询结果集将全部结果加载到客户端内存mysql已执行查询的连接句柄成功返回 MYSQL_RES* 结果集指针失败/无结果返回 NULL需调用 mysql_free_result 释放结果集mysql_num_rowsmy_ulonglong mysql_num_rows(MYSQL_RES *res);获取结果集中的总行数res结果集指针返回无符号长整型的总行数仅在 mysql_store_result 后有效mysql_num_fieldsunsigned int mysql_num_fields(MYSQL_RES *res);获取结果集中的总列数res结果集指针返回无符号整型的总列数列数与查询字段数量一致mysql_fetch_fieldsMYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);获取所有列的元信息字段名/类型/长度等res结果集指针返回 MYSQL_FIELD* 数组指针长度总列数可通过下标访问列信息如 field[i].namemysql_fetch_rowMYSQL_ROW mysql_fetch_row(MYSQL_RES *result);从结果集中逐行读取数据每次获取下一行result结果集指针成功返回 MYSQL_ROW 行数据指针读取完毕/失败返回 NULL循环读取至 NULL 结束每行按列存储数据#includeiostream#includemysql/mysql.h#includestringusingnamespacestd;intmain(){//初始化库MYSQL*mysmysql_init(nullptr);if(mysnullptr){cerrinit mysql failedendl;return1;}//连接数据库mysmysql_real_connect(mys,localhost,Jack,密码这边省略,conn,端口号省略,nullptr,0);//127.0.0.1或者localhost都可以if(mysnullptr){cerrconnect mysql failedendl;return2;}//设置编码mysql_set_character_set(mys,utf8);//SQL语句下发// string sqlinsert into t1 values(4,\Jon\,\7777777\);string sqlselect* from t1;mysql_query(mys,sql.c_str());//获取查询结果MYSQL_RES*mrsmysql_store_result(mys);if(mrsnullptr){cerrmysql store result failedendl;return3;}//获取行列introwmysql_num_rows(mrs);coutrow:rowendl;intfieldsmysql_num_fields(mrs);coutfields:fieldsendl;//获取数据的信息MYSQL_FIELD*myfieldsmysql_fetch_fields(mrs);for(inti0;ifields;i){coutmyfields[i].name ;}coutendl;//获取数据的内容for(inti0;irow;i){MYSQL_ROW myrowmysql_fetch_row(mrs);for(intj0;jfields;j){coutmyrow[j] ;}coutendl;}//释放结果集mysql_free_result(mrs);//关闭MySQL连接mysql_close(mys);return0;}接下来就要详细说说这些函数的一些情况包括他们的返回的类型都是比较重要的。sql执行完以后如果是查询语句我们当然还要读取数据如果updateinsert等语句那么就看下操作成功与否即可。获取查询结果 如果mysql_query返回成功那么我们就通过mysql_store_result这个函数来读取结果。该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据所以我们一定要记的 free(result)释放要用,不然是肯定会造成内存泄漏的。 执行完mysql_store_result以后其实数据都已经在MYSQL_RES 变量中了。因此上面的API除了mysql_store_result基本就是读取MYSQL_RES 中的数据。mysql会将所有的数据读取出来的时候全部都当成字符串因此可以理解为MYSQL_RES中有上述的结构其实也可以看成二维数组可以理解就行其实数据都变成了一个个字符串用指针被指向。MySQLConnect大概就讲到这里啦博主后续会继续更新更多Qt的相关知识干货满满如果觉得博主写的还不错的话希望各位小伙伴不要吝啬手中的三连哦如有小伙伴需要Qt的安装包可以私信我你们的支持是博主坚持创作的动力