博客主页:花果山~程序猿-CSDN博客
文章分栏:MySQL之旅_花果山~程序猿的博客-CSDN博客
关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长!
目录
[1. mysql_init](#1. mysql_init)
[3. mysql_query](#3. mysql_query)
嗨!收到一张超美的图,愿你每天都能顺心!
一.配置开发环境
我们是要使用C/C++语言在代码层面对MySQL进行连接操作,我们就需要其**头文件 + 源码库,**按照我们之前学的关于如何使用第三方库,可以参考本博客:
( 使用第三库操作详解【Linux】【软硬链接 | 动,静态库 | 使用第三库】_linux下stderr的头文件-CSDN博客
但以目前我们学到这里,这种步骤成功性还是无法保证(因为我们可以通过安装mysql,会自动代入我们需要的环境)。
因此首先我们是安装mysql软件,可以参考本篇博客:
下载完成后,我们通过下面指令来查看是否有devel(开发库)
cpp
rpm -qa | grep mysql
如果devel有,那么我们就可以直接正常编程了,编译的时候指定一下源码库即可,如:
-L/lib64/mysql -lmysqlclient;
如果没有devel,那么我们需要安装一个开发库,通过下面代码:
cpp
yum install -y mysql-community-devel
如果无法安装devel(开发库),还可以到官网下载开发包 ,再上传到Linux,但是不推荐怎么做,因为可能会因为开发包和自己MySQL的版本不同而出现各种奇奇怪怪的问题:如ssl证书问题,套接字问题......
下面我们可以手动查一下是否有,头文件 + 源码库
二,接口介绍
这里就只提一些C语言 常用接口,有需要的可以直接找文档,MySQL :: MySQL 5.7 C API Developer Guide :: 4 C API Function Reference
1. mysql_init
信息:mysql_init
函数是用于初始化一个MYSQL结构体 的,这个结构体用来存储连接MySQL服务器所需的信息以及连接后的状态信息。
cpp
MYSQL *mysql_init(MYSQL *mysql); // 如果第一次初始,设置为nullptr即可
返回值:成功时,返回指向初始化后的MYSQL
结构体的指针。如果分配新对象时失败,则返回NULL
2.mysql_real_connect
与mysql服务端建立连接(首先我们要有mysqld的账号)。 如果通过我们写的程序来连接服务端,那我们就成了客户端了,我觉得没这个必要,我们想通过程序来进行,简化对mysql命令的操作,实现自动化提高效率。
cpp
MYSQL* mysql_real_connect(MYSQL *mysql, //初始化好的mysql*结构体
const char *host, // 登录主机
const char *user, // 用户
const char *passwd, // 密码
const char *db, // 默认进入的库名, 可以为nullptr
unsigned int port, // 服务器端口号
const char *unix_socket, // 套接字种类,一般是域间套接字,可以默认为nullptr
unsigned long client_flag) // 默认为0
返回值:成功时,返回mysql,填入的初始化结构体指针;失败,返回nullptr;
关于C连接mysql编码集的问题:
我们知道已经设置了服务器的默认编码集:utf8 ,但C连接mysql的编码集默认是latin1,不支持中文,因此我们需要修改默认编码集。
cpp
int mysql_set_character_set(MYSQL *mysql, const char *csname) // csname 可为 "utf8"
3. mysql_query
在我们在mysql中创建表后,我们就可以通过mysql_query来向mysql发送mysql指令
cpp
int mysql_query(MYSQL *mysql,
const char *stmt_str) --mysql语句
返回值:成功,返回0;失败,返回其他值
最简单的就是增删改,案例如下:
cpp
mysql_set_character_set(my_sql, "utf8");
std::string query = "insert people values('张三', '12345', 1), ('李四', '520', 2)";
// query = "delete from people where name = '张三';
// query = 'update people set phone='1314' where id=2'
if (mysql_query(my_sql, query.c_str()))
{
std::cout << "insert fail" << std::endl;
fprintf(stderr, "错误原因:%s", mysql_error(my_sql));
}
就数增,删,改比较简单,因为就只有两种结果。难的是,对select 内容如何分析。
4.对select结果分析
1),mysql_store_result
功能:该变量会开辟块空间 ,专门在内存中接收查询出来的结果 ,作为未来函数的数据来源。
cpp
MYSQL_RES* mysql_store_result(MYSQL *mysql)
怎么理解这个新的返回类型:MYSQL_RES,我们可以这样简单的理解:简单理解来说是一个 char**的数组
该函数会调用 MYSQL 变量中的 st_mysql_methods 中的 read_rows 函数指针来获取查询的结果。
同时该函数会返回 MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。
同时该函数 malloc 了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result), 不然是肯定会造成内存泄漏的。
调用的free结果集的函数是:
void mysql_free_result (MYSQL_RES *result)
2)像mysql一样查看mysql数据
在上面我们大概知道了MySQL_RES的基本结构,同时,mysql也是通过C/C++实现,模拟mysql客户端打印结果并不难,学习步骤如下:
获取行,列
my_ulonglong mysql_num_rows ( MYSQL_RES * res ); -- 获取行 // my_ulonglong 就是 unsigned long long
my_ulonglong mysql_num_fields ( MYSQL_RES * res ); -- 获取列
提取数据
如何循环获取MYSQL_RES中的内容,先了解下面两个接口
MYSQL_ROW mysql_fetch_row (MYSQL_RES *result)
功能:每次调用返回列的起始地址,并向后移动一位。通过查看MYSQL_ROW的源代码可知
mysql_fetch_row 类似于迭代器的函数,每次调用将自动"++",往后移动
截取的案例:
cpp
MYSQL_ROW line = 0;
for (int n = 0; n < rows; n++)
{
line = mysql_fetch_row(result);
for (int k = 0; k < field; k++)
{
std::cout << line[k] << "\t";
}
std::cout << std::endl;
}
提取属性名
上面我们能查找到内容,但并没有属性框,也就是不知道每个列名,可以通过下面函数进行获取
MYSQL_FIELD * mysql_fetch_field (MYSQL_RES *result)
返回值:返回一个结构体指针,该结构体里存放着每个列的属性数据。
使用案例:
cpp
MYSQL_FIELD* qual = mysql_fetch_field(result);
for (int j = 0; j < field; j++)
{
std::cout << qual[j].name << "\t";
}
std::cout << std::endl;
另外, mysql C api 还支持事务等常用操作,大家下来自行了解 :
my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
my_bool STDCALL mysql_commit(MYSQL * mysql);
my_bool STDCALL mysql_rollback(MYSQL * mysql);
三,图形化界面方式连接MYSQL
使用mysql,我们已经可以通过1.通过mysql客户端命令行操作。2. C语言代码方式连接mysql 第三种就是使用最简单的图形化界面方式来操作mysql。
使用比较好推荐:
1.PHPMyandmin(免费,体验良好)
安装流程:CentOS7 安装 phpMyAdmin - helloliyh - 博客园 (cnblogs.com)
(亲测基本上没有遇到啥问题,需要的注意点就是买的服务器,不仅需要修改自己的防火墙,而且需要在服务器控制台添加安全组)
2.Navicat(收费但魔法,体验良好)
3.Mysql workbench(官方标配免费,但体验一般)
mysql知识先到这里了,江湖见
结语
本小节就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区评论,如果给小伙伴带来一些收获,请动动你发财的小手点个免费的赞,你的点赞和关注永远是博主创作的动力源泉。