【MySQL】MySQL库

使用C/C++语言链接MySQL

  • 一、mysql connect
  • 二、mysql 接口介绍
    • 1. 初始化 mysql_init()
    • 2. 链接数据库 mysql_real_connect()
    • 3. 执行 mysql 命令 mysql_query()
    • 4. 获取执行结果 mysql_store_result()
    • 5. 释放空间
    • 5. 关闭 mysql 链接 mysql_close()

一、mysql connect

要使用C语言连接 mysql,需要使用 mysql 官网提供的库,大家可以去官网下载。

由于我们以前在我们的 Linux 中已经安装了有关 MySQL 的安装包,它会默认帮我们安装了链接 MySQL 的头文件和库,我们可以查看一下:

在这里插入图片描述

在这里插入图片描述

其中 include 包含所有的方法声明, lib64 包含所有的方法实现(打包成库)。

如果大家在安装的时候没有这些头文件和库,可以执行如下指令安装:

				sudo yum install mysql-devel

安装好以后,我们可以通过 mysql_get_client_info() 接口函数,来验证我们是否引入成功:

				#include <iostream>
				#include <mysql/mysql.h>
				
				int main()
				{
				    std::cout <<  mysql_get_client_info() << std::endl;
				    return 0;
				}

结果如下:

在这里插入图片描述

如上,我们就成功引入了。

二、mysql 接口介绍

我们可以查看 MySQL5.7 的接口文档介绍。

1. 初始化 mysql_init()

想要使用库,必须先进行初始化,其函数为 mysql_init(),其在官方文档中的定义如下:

				MYSQL *mysql_init(MYSQL *mysql);

它的返回值是一个 MySQL* 的对象,我们可以这样初始化:

				MYSQL* fp = mysql_init(nullptr);

2. 链接数据库 mysql_real_connect()

初始化完毕之后,必须先链接数据库,在进行后续操作。(mysql 网络部分是基于 TCP/IP 的),其在官方文档的定义如下:

			MYSQL *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 clientflag);

其中 mysql 为我们初始化返回的对象;host 为需要链接的主机;user 为用户名;passwd 为用户密码;db 为使用的数据库名称;port 为端口号;后面两个参数不重要,我们可以设置为 nullptr0

而返回值如果成功是一个对象,否则就是空,接下来我们就可以使用这个接口了,例如以下代码,我们将函数中的参数在全局中用对应的名字定义了,所以直接传进去即可:

				int main()
				{
				    MYSQL* my = mysql_init(nullptr);
				    if(my == nullptr) return -1;
				
				    if(mysql_real_connect(my, host, user, passwd, db, port, nullptr, 0) == nullptr) return -1;
				
				    return 0;
				}

如果 nullptr 报错,修改一下 g++ 选项即可:

				g++ -o test test.cpp -std=c++11 -l mysqlclient -L /lib64/mysql

建立好链接之后,获取英文没有问题,如果获取中文是乱码,是由于原始默认是 latin1,我们可以通过接口设置链接的默认字符集是 utf8,如下:

				mysql_set_character_set(my, "utf8");

3. 执行 mysql 命令 mysql_query()

我们查看文档中的介绍:

在这里插入图片描述
在这里插入图片描述

				int mysql_query(MYSQL *mysql, const char *stmt_str);

其中返回值0为成功,非0则是失败;第一个参数上面已经介绍过,第二个参数为要执行的 sql 语句。我们先在库中创建一张表,如下:

在这里插入图片描述

接下来我们使用接口插入数据:

				int main()
				{
				    MYSQL* my = mysql_init(nullptr);
				    if(my == nullptr) return -1;
				
				    if(mysql_real_connect(my, host, user, passwd, db, port, nullptr, 0) == nullptr) return -1;
				
				    mysql_set_character_set(my, "utf8");
				
				    if(mysql_query(my, "insert into for_test values(1,'James')") != 0) return -1;
				    else std::cout << "query success" << std::endl;
				
				    return 0;
				}

运行结果如下:

在这里插入图片描述

接下来查看数据库中的表数据:

在这里插入图片描述

如果我们使用 mysql_query() 查看表数据呢?我们可以尝试一下:

				int main()
				{
				    MYSQL* my = mysql_init(nullptr);
				    if(my == nullptr) return -1;
				
				    if(mysql_real_connect(my, host, user, passwd, db, port, nullptr, 0) == nullptr) return -1;
				
				    mysql_set_character_set(my, "utf8");
				
				    if(mysql_query(my, "select * from for_test") != 0) return -1;
				    else std::cout << "query success" << std::endl;
				
				    return 0;
				}

在这里插入图片描述

我们看到,运行之后虽然成功了,但是什么都没有显示出来,这是因为 sql 如果是查询语句,我们还要读取数据!

4. 获取执行结果 mysql_store_result()

其实 my 中会存放每次读取到的结果,但是这个结果还需要我们再次提取出来,所以如果 mysql_query 返回成功,那么我们就通过 mysql_store_result 这个函数来读取结果。原型如下:

在这里插入图片描述

				MYSQL_RES *mysql_store_result(MYSQL *mysql);

该函数会调用 MYSQL 变量中的 st_mysql_methods 中的 read_rows 函数指针来获取查询的结果。同时该函数会返回 MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数 malloc 了一片内存空间来存储查询过来的数据,所以我们一定要记得 free(result),不然是肯定会造成内存泄漏的。 执行完 mysql_store_result 以后,其实数据都已经在 MYSQL_RES 变量中了。下面的 api 基本就是读取 MYSQL_RES* 中的数据:

  • 获取结果行数 mysql_num_rows

      			my_ulonglong mysql_num_rows(MYSQL_RES *res);
    

其中 my_ulonglong 就是 unsigned long long,如下图:

在这里插入图片描述

  • 获取结果列数 mysql_num_fields

      			unsigned int mysql_num_fields(MYSQL_RES *res);
    
  • 获取列属性 mysql_fetch_fields

      			MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
    

mysql_fetch_fields 可以获取列的属性,其中获取列属性中的列名只需要指定 name 即可,如下:

			   // 属性
			    MYSQL_FIELD *field_array = mysql_fetch_fields(res);
			    for(int i = 0; i < fields; i++)
			    {
			        std::cout << field_array[i].name << "\t";
			    }
			    std::cout << std::endl;
  • 获取结果内容 mysql_fetch_row

      			MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
    

我们该怎么理解读取这个数据呢?首先需要知道,mysql 将所有的数据读取出来的时候全部都当作字符串。

其次我们在 select * from for_test 的时候,显示出来的是一个表格的形状,所以我们就可以给它进行按行按列分割,如下图:

在这里插入图片描述

其实我们可以把这个返回的 MYSQL_ROW 变量看作是一个 char** 的指针,如下图:

在这里插入图片描述

更重要的是,返回的这个 MYSQL_ROW 的变量可以像迭代器一样使用,我们不需要手动进行迭代,它会帮我们自己迭代,例如:

			    // 内容
			    for(int i = 0; i < rows; i++)
			    {
			        MYSQL_ROW line = mysql_fetch_row(res);
			        for(int j = 0; j < fields; j++)
			        {
			            std::cout << line[j] << "\t";
			        }
			        std::cout << std::endl;
			    }

5. 释放空间

我们上面开辟的空间我们最后也要释放掉,就是 char** 这段空间,接口为:

在这里插入图片描述

我们在最后直接调用即可,参数就是我们上面的 res.

5. 关闭 mysql 链接 mysql_close()

				void mysql_close(MYSQL *mysql);

关闭链接我们直接调用以上方法即可,参数就是我们初始化的返回值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/364950.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字节大佬含泪吐血总结系列之 应用层常见协议

字节大佬含泪吐血总结系列之 应用层常见协议 原文地址&#xff1a;https://github.com/Snailclimb/JavaGuide 文章目录 字节大佬含泪吐血总结系列之 应用层常见协议HTTP:超文本传输协议Websocket&#xff1a;全双工通信协议SMTP:简单邮件传输(发送)协议POP3/IMAP:邮件接收的协…

Jmeter高级使用

文章目录 JMeter之计数器JMeter之集合点JMeter之断言JMeter之动态关联后置处理器&#xff1a;正则表达式提取器 JMeter之分布式测试JMeter之组件执行顺序元件的作用域元件的执行顺序配置元件Http Cookie管理器 多协议接口的性能测试Debug采样器Http请求中文乱码的解决Post参数设…

cip、ethernet/ip开源协议栈:开发源代码

EtherNet/IP是一个工业以太网协议&#xff0c;它结合标准协议TCP和UDP&#xff0c;在以太网上基础上的通用工业协议&#xff08;CIP&#xff09;。 该协议由ODVA维护。ODVA还管理其他CIP实现&#xff0c;如DeviceNet。 协议栈和源代码下载 www.jngbus.com 在开发Ethernet/Ip…

如何在CentOS安装DataEase数据分析服务并实现远程访问管理界面

如何在CentOS安装DataEase数据分析服务并实现远程访问管理界面 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 202…

QSqlRelationalTableModel 关系表格模型

一、 1.1 QSqlRelationalTableModel继承自QSqlTableModel&#xff0c;并且对其进行了扩展&#xff0c;提供了对外键的支持。一个外键就是一个表中的一个字段 和 其他表中的主键字段之间的一对一的映射。例如&#xff0c;“studInfo”表中的departID字段对应的是“departments…

【SpringCloud】使用OpenFeign进行微服务化改造

目录 一、需求与背景二、OpenFeign 远程调用技术原理三、项目代码演示3.1 引入依赖3.2 实现OpenFeign注解修饰接口3.3 指定 OpenFeign 远程调用接口的扫描路径 四、OpenFeign 在日志中打印Request和Response五、OpenFeign 客户端超时配置六、使用 OpenFeign 实现服务降级6.1 实…

【python】OpenCV—Tracking(10.1)

学习来自《Learning OpenCV 3 Computer Vision with Python》Second Edition by Joe Minichino and Joseph Howse 文章目录 检测移动的目标涉及到的 opencv 库cv2.GaussianBlurcv2.absdiffcv2.thresholdcv2.dilatecv2.getStructuringElementcv2.findContourscv2.contourAreacv2…

STM32 IIC电量计LTC2944

1 描述 LTC2944 可在便携式产品应用中测量电池充电状态、电池电压、电池电流及其自身温度。宽输入电压范围允许使用高达 60V 的多节电池。精密库仑反向积分电流通过电池正极端子与负载或充电器之间的检测电阻器。 电压、电流和温度由内部 14 位无延迟 ΔΣ™ ADC 测量。测量结…

09-信息收集-APP及其他资产等

信息收集-APP及其他资产等 信息收集-APP及其他资产等一、APP提取季抓包及后续配合1、某APK一键提取反编译2、利用bp抓取更多URL 二、某IP无web框架下的第三方测试1、各种端口一顿乱扫 —— 思路2、各种接口一顿乱扫 —— 思路3、接口部分一顿测试 —— 思路 三、**案例演示**1、…

KubeSphere 社区双周报|Fluent Bit 升级到 v2.2.2|2024.01.18-02.01

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2024.01.18-02.01…

新加坡大带宽服务器优势特点

随着互联网技术的不断进步&#xff0c;大带宽服务器在满足高速数据传输需求方面发挥着越来越重要的作用。新加坡&#xff0c;作为全球互联网基础设施的重要枢纽&#xff0c;其大带宽服务器在全球范围内备受关注。本文将深入探讨新加坡大带宽服务器的优势特点&#xff0c;以及如…

【Python基础】Numpy使用指南

文章目录 Numpy使用指南1 numpy简介2 numpy安装3 ndarray3.1 ndarry轴与秩3.2 ndarray 相关属性3.3 创建 ndarray 对象3.4 np.radom相关方法3.5 reshape方法3.6 ndarray对象转其他数据结构 4 numpy的数据类型5 numpy访问与修改5.1 一维array5.2 numpy中的轴 6 numpy计算6.1 基本…

Methodot低代码实战教程(一)——熟悉可视化Echart组件

一、产品介绍&#xff1a; Methodot是行云创新旗下一款面向研发使用的一站式云原生开发及应用托管平台&#xff0c;产品内有大量开箱即用的服务和开发工具&#xff0c;例如&#xff1a; 支持开发团队进行微服务架构设计&#xff08;例如一个袜子商店管理系统&#xff09;&…

病原菌共感染研究思路

近年来,多微生物共感染在临床上的报道日益增多。其中,多细菌共感染占据了细菌感染的25% ,其发病率和严重性也相应增加。尤其在形成生物膜后,这种共感染对疾病的发生、发展和临床治疗生重要影响,同时也给临床治疗带来了更大的挑战。 随着测序的发展&#xff0c;应用高通量转录组…

Java黑马——拼图小游戏

拼图小游戏&#xff08;GUI&#xff09; AWT包会有些兼容问题&#xff0c;不支持某些中文 在本次游戏的GUI开发中&#xff0c;我们将使用Swing包 一、主界面分析 这些东西统一称为组件&#xff0c;JFrame是一个组件、JMenuBar也是一个组件、等等 1、练习一&#xff1a;创建主…

离线生成双语字幕,一键生成中英双语字幕,基于AI大模型,ModelScope

离线生成双语字幕整合包,一键生成中英双语字幕,基于AI大模型 制作双语字幕的方案网上有很多&#xff0c;林林总总&#xff0c;不一而足。制作双语字幕的原理也极其简单&#xff0c;无非就是人声背景音分离、语音转文字、文字翻译&#xff0c;最后就是字幕文件的合并&#xff0c…

AI大模型开发架构设计(7)——人人都需要掌握的AI编程及应用案例实战

文章目录 人人都需要掌握的AI编程及应用案例实战1 AI代码生成模型与AI编程助手介绍程序设计方式的发展自动代码生成AI编程工具 2 AI编程助手的代码生成模型架构剖析以 CodeGeeX 为例-发展过程以 CodeGeeX 为例-训练过程以 CodeGeeX 为例-大规模代码数据处理以 CodeGeeX 为例-模…

消息中间件特性

一&#xff1a;消息队列的主要作用是什么&#xff1f; 1.消息队列的特性&#xff1a; 业务无关&#xff0c;一个具有普适性质的消息队列组件不需要考虑上层的业务模型&#xff0c;只做好消息的分发就可以了&#xff0c;上层业务的不同模块反而需要依赖消息队列所定义的规范进行…

Base64编码原理

Base64编码原理非常简单&#xff0c;首先确定好要编码的字符串&#xff0c;并查找其对应的 ASCII码将其转换为二进制表示&#xff0c;每三个8位的字节转换为四个6位的字节 &#xff08;384 624&#xff09;&#xff0c;把6位的最高位添两位数字0 &#xff0c;组成四个8位的字节…

内裤洗衣机有用吗?口碑好的小型洗衣机推荐

随着内衣洗衣机的流行&#xff0c;很多小伙伴在纠结该不该入手一款内衣洗衣机&#xff0c;专门来洗一些贴身衣物&#xff0c;答案是非常有必要的&#xff0c;因为我们现在市面上的大型洗衣机只能做清洁&#xff0c;无法对我们的贴身衣物进行一个高强度的清洁&#xff0c;而小小…