【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);

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle篇—普通表迁移到分区表(第五篇,总共五篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

【深度学习】ND4J-科学计算库

目录 简介 基础用法 基础信息 数组创建 打印数组 变更维度&堆叠 加减乘除 累加/最大/最小 转换操作 矩陈乘法 索引/迭代 深拷贝/引用传递/视图 引用传递 视图 深拷贝 其它 简介 ND4J主要是JVM的科学计算库&#xff0c;内置了很多计算方法&#xff0c;目的…

利用tshark从pcap中解析http流量

使用tshark解析 安装tshark apt install tshark # 测试 tshark -r gitlab.pcap -T fields -Y http -e tcp.stream -e http.request.method -e http.request.uri -e http.request.version -e http.request.line -e http.response.version -e …

【AIGC扫盲】人工智能大模型快速入门

人工智能大模型的技术框架主要有以下几种&#xff1a; TensorFlow&#xff1a;这是一个由Google Brain团队开发的开源库&#xff0c;用于进行高性能数值计算&#xff0c;特别是用于训练和运行深度学习模型。TensorFlow提供了一种称为计算图的编程模型&#xff0c;它允许用户定义…

MS Access 函数参考手册

目录 MS Access 字符串函数 MS Access 数值函数 MS Access 日期函数 MS Access 其他函数 MS Access 字符串函数 函数描述Asc返回特定字符的 ASCII 值Chr返回指定ASCII码的字符Concat with &将两个或多个字符串加在一起CurDir返回指定驱动器的完整路径Format用指定的格…

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

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

IDEA中的Run Dashboard

Run Dashboard是IntelliJ IDEA中的工具【也就是View中的Services】&#xff0c;提供一个可视化界面&#xff0c;用于管理控制应用程序的运行和调试过程。 在Run DashBoard中&#xff0c;可以看到所有的运行配置&#xff0c;以及每个配置的运行状态&#xff08;正在运行&#xf…

【vue2源码】阶段一:Vue 初始化

文章目录 一、项目目录1、主目录2、打包入口 二、构造函数Vue的初始化1、创建 Vue 构造函数2、初始化内容分析2.1 initMixin2.2 stateMixin2.3 eventsMixin2.4 lifecycleMixin2.5 renderMixin 一、项目目录 源码版本&#xff1a;2.7.16 1、主目录 src |-- compiler # 包…

Camille-学习笔记-web基础知识

web基础1.系统架构 B/S :Browser/Server 网站 界面层&#xff08;UI&#xff09; 业务逻辑层&#xff08;业务&#xff09; 数据访问层&#xff08;数据库&#xff09; 静态网页&#xff1a;和服务器没有数据交互 动态网页&#xff1a;网页数据可以和服务器进行数据交互 URL…

python执行linux系统命令的三种方式

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 1. 使用os.system 无法获取命令执行后的返回信息 import osos.system(ls)2. 使用os.popen 能够获取命令执行后的返回信息 impor…

Vue3+Koa2实现图片上传(不再畏惧)

大家好&#xff0c;我是勇宝&#xff0c;一个热爱前端的小学生&#xff0c;年关将至&#xff0c;提前祝大家新年快乐。今天呢&#xff0c;我们就来好好的啃一啃图片上传&#xff0c;从一个前端开发者的角度来探讨一下图片上传前后端到底都做了哪些事情。 文章目录 一、技术摘要…

《Pandas 简易速速上手小册》第7章:Pandas 文本和类别数据处理(2024 最新版)

文章目录 7.1 文本数据的基本操作7.1.1 基础知识7.1.2 重点案例&#xff1a;客户反馈分析7.1.3 拓展案例一&#xff1a;产品评论的关键词提取7.1.4 拓展案例二&#xff1a;日志文件中的日期提取 7.2 使用正则表达式处理文本7.2.1 基础知识7.2.2 重点案例&#xff1a;日志文件错…

VMware创建虚拟机

点击文件&#xff0c;新建虚拟机 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

【LeetCode】每日一题 2024_2_2 石子游戏 VI(排序、贪心)

文章目录 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01;题目&#xff1a;石子游戏 VI题目描述代码与解题思路 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;石子游戏 VI 题目链接&#xff1a;1686. 石子游戏 VI 题目描述…

Hbase-2.4.11_hadoop-3.1.3集群_大数据集群_SSH修改默认端口22为其他端口---记录025_大数据工作笔记0185

其实修改起来非常简单,但是在大数据集群中,使用到了很多的脚步,也需要修改, 这里把,大数据集群,整体如何修改SSH端口,为22022,进行总结一下: 0.hbase-2.4.11的话,hbase集群修改默认SSH端口22,修改成22022,需要修改 需要修改/opt/module/hbase-2.4.11/conf/hbase-env.sh 这里…

自动化测试笔记

TDD 之 ATDD 之 CUCUMBER & BDD CUCUMBER 可将人类自然语言转化为&#xff08;Ruby, python, javascript, C#等&#xff09;测试代码。 可以传递参数&#xff0c;可打标签tag进行分类管理&#xff0c;&#xff0c; login Scenario: … Given ... When ... Then ... 可加…

程序人生 - ICP 备案和域名备案是一回事吗?区别是什么?

ICP备案和域名备案是两个不同的概念&#xff0c;ICP备案是指互联网信息服务提供者备案&#xff0c;也就是对于在中国境内提供互联网信息服务的网站必须进行备案登记。而域名备案是指将域名与网站的实际内容进行备案登记。 ICP备案是针对网站运营者的一种许可证&#xff0c;必须…

【Android测试】Appium是否适合用于模拟多指触控呢?

1 问题说明 对于 mobile app automation, ChatGPT4会推荐Appium作为底层的触控工具库&#xff1b;但是&#xff0c;我们一直感觉pyminitouch其实是更好的选择&#xff1b;那么&#xff0c;Appium是否适合用于模拟多指触控呢&#xff1f; 2 资料查询 2.1 Williamfzc: minitou…

pytorch调用gpu训练的流程以及示例

首先需要确保系统上安装了CUDA支持的NVIDIA GPU和相应的驱动程序。 基本步骤如下 检查CUDA是否可用&#xff1a; 使用 torch.cuda.is_available() 来检查CUDA是否可用。 指定设备&#xff1a; 可以使用 torch.device(“cuda:0”) 来指定要使用的GPU。如果系统有多个GPU&…

shell脚本之免交互

目录 一、Here Document 免交互 1、交互与免交互的概念 2、 Here Document 概述 二、Here Document 应用 1、使用cat命令多行重定向 2、使用tee命令多行重定向 3、使用read命令多行重定向 4、使用wc -l统计行数 5、使用passwd命令用户修改密码 6、Here Document 变量…