【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;并且也会默默的点赞收藏加关注❣…

如何在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…

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…

《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 这里…

shell脚本之免交互

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

fastadmin导入excel并对导入数据处理

情景描述 fastadmin有自带的导入功能&#xff0c;但是不好用&#xff0c;它要求你的表格标题必须跟数据表的备注一致&#xff0c;而且拿到的数据是直接插入数据表&#xff0c;我们无法获取想要的数据并对数据进行处理&#xff1b;而且有时候我们只是想要单纯的读取文件功能&…

丰田再怼「纯电动」,抛出「30%上限论」背后的焦虑和矛盾

让传统车企「丢掉」燃油车的包袱&#xff0c;并不简单。一边是赚钱&#xff0c;一边是烧钱&#xff0c;如何平衡是一个不小的难题。 本周&#xff0c;丰田董事长丰田章男对外表示&#xff0c;其预测未来电动汽车的市场份额将只有30%。而在电动化进程中&#xff0c;丰田章男一直…

【智慧农业】东胜物联温室监控系统硬件解决方案,自动化控制温室灯光、温湿度等

温室监控系统旨在提高智慧农业的工业生产率和效率。根据最近的一项研究&#xff0c;农业领域的物联网市场预计到2026年将达到约187亿美元。物联网技术包括自主耕作方法&#xff0c;帮助农场生产高质量的商品&#xff0c;并为农场经理提供最佳功能。某上市药企因业务需要&#x…

惊鸿一瞥-网络初识

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;惊鸿一瞥-网络初识 一.网络的发展过程 网络的发展过程是循序渐进的,大致可以分为四个阶段: 单机时代->局域网时代->广域网时代->互联网时代 单机时代:就是每个机器之间…

[SwiftUI]使用UIActivityViewController来实现系统分享功能

在 SwiftUI 中&#xff0c;你可以使用 UIActivityViewController 来实现系统分享功能。由于 SwiftUI 目前没有直接提供类似的视图或修饰符&#xff0c;你需要使用 UIViewControllerRepresentable 协议来创建一个可以在 SwiftUI 视图中使用的 ActivityView。 首先&#xff0c;你…

BIO、NIO编程与直接内存、零拷贝

一、网络通信 1、什么是socket&#xff1f; Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层&#xff0c;它是一组接口&#xff0c;一般由操作 系统提供。客户端连接上一个服务端&#xff0c;就会在客户端中产生一个 socket 接口实例&#xff0c;服务端每接受 一个客户端…

[机缘参悟-142] :一个软件架构师对佛学的理解 -6- 从计算机和数学的角度理解佛家的“因果”与十二因缘

目录 一、什么是因缘 1.1 佛家的因缘 1.2 佛家的因缘与因果轮回 1.2 从计算机角度理解因缘 1.3 从数学的角度理解因缘 二、佛家的十二因缘 2.1 大多数人的轮回 2.2 大多数人的的十二因缘轮回 2.3 十二因缘与三世因果的关系 2.4 十二因缘的现实意义 2.5 十二因缘与生…

Trie树数据结构——(字符串统计,最大异或对)

Trie树&#xff1a;是一种能够高效存储和查找字符串集合的数据结构 Trie字符串统计 思路&#xff1a; &#xff08;笔记来自AcWing 835. Trie字符串统计 - AcWing&#xff09; 代码如下&#xff1a; #include<iostream> #include<cstdio> #include<string>…

上位机图像处理和嵌入式模块部署(二进制图像的读写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前我们说过&#xff0c;对于图像处理而言&#xff0c;势必会涉及到文件的读写。但是不同格式文件的读写&#xff0c;这本身又是体力活&#xff0…

CodeFuse成功支持通义千问算法大赛,评测方案已开源

前段时间&#xff0c; 首届通义千问AI挑战赛成功举办&#xff0c;CodeFuse 为大赛提供技术支持&#xff0c;模型微调框架 MFTCoder 和 CodeFuseEval 评测框架为大赛保驾护航&#xff0c;助力大赛圆满完成。我们基于leetcode 阿里和蚂蚁最新面试题库建设了“模型赛马”在线打榜的…