当前位置: 首页 > news >正文

「MySQL-04」Linux环境下使用C/C++连接并操纵MySQL

目录

一、准备mysql库:Connector/C

1. 查看是否有mysql相关的库和头文件

2. 安装devel(开发库)

3.到官网下载开发包,并上传到Linux

3.0 须知

3.1 到官网下载开发包

3.2 上传安装包至Linux

二、mysql库:Connector/C 的使用

1. 创建并初始化mysql对象

2. 销毁mysql对象

3. 链接数据库

4. 设置编码格式

5. 下发SQL语句给数据库

6. 获取执行sql语句的结果

6.1 从myql对象里读取结果

6.2 从MYSQL_RES对象里获取行数

6.3 从MYSQL_RES对象里获取列数

6.4 从MYSQL_RES对象里获取列名

6.5 从MYSQL_RES对象里一行一行的读取结果

拓展】Connector/C库还支持事务等常用操作 

练习】使用Connector/C库编写一个简易的mysql客户端


一、准备mysql库:Connector/C

        要使用C/C++连接mysql,需要devel(开发库),一般来说在Linux上下好了MySQL这个库也会顺带给我们下载好。如果没有也可以单独安装。

1. 查看是否有mysql相关的库和头文件

  • 使用命令 rpm -qa | grep mysql 查看是否有mysql相关的库,重点是devel(开发库):

        

  • 使用命令 ls /lib64/mysql/ -al 查看库的链接情况

        

  • 使用命令 ls /usr/include/mysql/ 查看mysql相关的头文件:

        

2. 安装devel(开发库)

如果只是缺少devel(开发库)可尝试用yum安装

yum install -y mysql-community-devel

安装好devel(开发库)后:

我们只需要用 #include <mysql/mysql.h>  就可引入mysql库。

编译时加上:-L/lib64/mysql -lmysqlclient 帮助编译器找到头文件和库即可。

3.到官网下载开发包,并上传到Linux

3.0 须知

        如果无法安装devel(开发库),还可以到官网下载开发包,再上传到Linux,但是不推荐怎么做,因为可能会因为开发包和自己MySQL的版本不同而出现各种奇奇怪怪的问题:如ssl证书问题,套接字问题……

        所以能不这样做尽量不要这样做,要用这个方法还不如看博主文章重新安装MySQL。

按照里面的方法一定能安装好mysql和devel(开发库)。


3.1 到官网下载开发包

a. 官网下载Download Archives

 b. 选择MySQL Connector/C

c. 选择系统和版本。下图为Linux版的下载。


3.2 上传安装包至Linux

a. 上传安装包: rz -y

b. 解压: tar -xzvf mysql-connector-c-6.1.11-linux-glibc2.12-x86_64.tar.gz

c. 在要使用库的目录下建立头文件的软链接和库的软链接

d. 修改配置文件让g++编译时能找到动态库

如果提示找不到动态库libmysqlclient,我们还需要修改配置文件(以下命令建议在root用户下执行):

1. 添加配置文件:vim /etc/ld.so.conf.d/lib_search.conf

2. 往里面加入 mysql库中lib目录的路径:

        路径获取方式:cd进入刚才解压好的文件中,使用pwd lib查看lib目录的路径

3. 然后运行指令 sudo ldconfig 更新配置文件

e. 写代码时要引入头文件 "软链接地址/mysql.h"

编译时要加上 -I./头文件的软链接地址/include -L./库的软链接地址 -lmysqlclient 帮助编译器找到头文件和库。


二、mysql库:Connector/C 的使用

1. 创建并初始化mysql对象

函数:mysql_init()
示例:MYSQL *mysql = mysql_init(NULL);

2. 销毁mysql对象

函数:mysql_close(要销毁的对象);
示例:mysql_close(mysql);

3. 链接数据库

初始化完毕之后,必须先链接数据库,在进行后续操作。(mysql网络部分是基于TCP/IP的)

函数:mysql_real_connect(mysql, host, user, passwd, db, port, unix_socket, clientflag)//使用指定用户登录指定数据库,该用户必须有远程访问权限参数说明:mysql  :  mysql对象host   :  要连接的主机user   :  mysql用户,该用户必须有远程访问权限passwd :  用户密码db     :  要连接的数据库port   :  端口号unix_socket :  套接字,nullptr为默认由系统选择clientflag  :  客户端标志,默认为0示例:
{std::string host   = "localhost";std::string user   = "test"; //该用户必须有远程访问权限std::string passwd = "123";std::string db     = "test_table";unsigned int port   = 3306;if(mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){fprintf(stderr, "%s\n", mysql_error(mysql)); //显示连接时遇到的错误std::cerr << "Failed to connect to MySQL user!\n";exit(-2);}std::cout << "Successfully to connect to MySQL user!\n";
}

4. 设置编码格式

//建立好链接之后,获取英文没有问题,但如果获取中文就是乱码。
//设置链接的默认字符集为utf8,原始默认是latin1(拉丁文)
mysql_set_character_set(myfd, "utf8");

5. 下发SQL语句给数据库

函数:int mysql_query(MYSQL *mysql, const char *sql);//下发SQL语句,让上面指定用户执行SQL语句对上面指定的数据库进行操作
参数:mysql : mysql对象sql : sql语句
返回值:成功返回0,失败返回1。
示例:std::string sql = "select * from test_table";int n = mysql_query(mysql, sql.c_str());

6. 获取执行sql语句的结果

sql执行完以后,如果是查询语句,我们还要读取查询出来的结果,该结果以二进制的形式被保存在mysql对象里,所以我们还需要一个函数来读取保存在mysql对象里的结果。

6.1 从myql对象里读取结果

函数:MYSQL_RES *mysql_store_result(MYSQL *mysql);参数:mysql对象。返回值:MYSQL_RES对象,一个专门用来保存查询结果的对象,它有各种获取结果的方法。说明:对于该函数,我们需要自己创建一个MYSQL_RES指针来接收返回的MYSQL_RES对象,因为
MYSQL_RES对象malloc了一片内存空间来存储查询过来的数据,所以我们一定要记得 free(),
不然会造成内存泄漏。如果用的是较新版本的devel(开发库),可能创建出来的MYSQL_RES对象
会自动释放,free会报空指针异常,就不用free。执行完mysql_store_result()以后,其实
数据都已经在MYSQL_RES对象中了,下面的api基本就是读取 MYSQL_RES对象中的数据。示例:MYSQL_RES* res = mysql_store_result(mysql);if(res == nullptr) exit(0);free(res); //如果报错证明当前版本的开发库中的mysql对象会自动释放,删除此句即可。

6.2 从MYSQL_RES对象里获取行数

函数:my_ulonglong mysql_num_rows(MYSQL_RES *res);参数:MYSQL_RES对象。返回值:一个长整型。示例:int rows = mysql_num_rows(res);std::cout << "表中有" << rows << "行。\n";

6.3 从MYSQL_RES对象里获取列数

函数:unsigned int mysql_num_fields(MYSQL_RES *res);
参数:MYSQL_RES对象。
返回值:一个无符号整型。
示例:int cols = mysql_num_fields(res);std::cout << "表中有" << cols << "列。\n";

6.4 从MYSQL_RES对象里获取列名

函数:MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);参数:MYSQL_RES对象。返回值:MYSQL_FIELD:结构体数组指针,指向结构体数组,结构体的name成员为字符串通过用来保存列名。示例:int cols = mysql_num_fields(res); //获取列数MYSQL_FIELD *col_name = mysql_fetch_fields(res);for(int i = 0; i < cols; i++){std::cout << col_name[i].name << "  |  ";}

6.5 从MYSQL_RES对象里一行一行的读取结果

函数:MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);参数:MYSQL_RES对象。返回值:MYSQL_ROW对象,相当于一个二维数组,用来保存表中内容示例:MYSQL_ROW line; //创建MYSQL_ROW对象,用来保存表中内容for(int i = 0; i < rows; i++) //行数rows通过mysql_num_rows()获取。{line = mysql_fetch_row(res);for(int j = 0; j < cols; j++) //列数cols通过mysql_num_fields()获取。{std::cout << line[j]<< " "; //打印第i行的第j列内容。}std::cout << std::endl;}


拓展】Connector/C库还支持事务等常用操作 

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

练习】使用Connector/C库编写一个简易的mysql客户端

源代码:MySQL · yblhlk/Linux课程 - 码云 - 开源中国 (gitee.com)


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

相关文章:

「MySQL-04」Linux环境下使用C/C++连接并操纵MySQL

目录 一、准备mysql库&#xff1a;Connector/C 1. 查看是否有mysql相关的库和头文件 2. 安装devel(开发库) 3.到官网下载开发包&#xff0c;并上传到Linux 3.0 须知 3.1 到官网下载开发包 3.2 上传安装包至Linux 二、mysql库&#xff1a;Connector/C 的使用 1. 创建并初始化mys…...

【力扣】两数相除(c/c++)

目录 题目 注意&#xff1a; 示例 1: 示例 2: 提示&#xff1a; 题目解析 题目思路 代码思路 数据处理 注意 减法函数 第一次使用的函数 问题 第二次改良后的代码 处理i的值并且返回 总代码 力扣的代码 注意 题目 给你两个整数&#xff0c;被除数 dividend 和…...

《Kubernetes部署篇:Ubuntu20.04基于二进制安装安装kubeadm、kubelet和kubectl》

一、背景 由于客户网络处于专网环境下&#xff0c; 使用kubeadm工具安装K8S集群&#xff0c;由于无法连通互联网&#xff0c;所有无法使用apt工具安装kubeadm、kubelet、kubectl&#xff0c;当然你也可以使用apt-get工具在一台能够连通互联网环境的服务器上下载kubeadm、kubele…...

go学习part21 Redis

300_尚硅谷_Redis的基本介绍和原理示意_哔哩哔哩_bilibili Redis 命令 | 菜鸟教程 (runoob.com) 1.基本介绍 2.基本操作 Redis的基本使用: 说明:Redis安装好后&#xff0c;默认有16个数据库&#xff0c;初始默认使用0号库,编号是0...15 1.添加key-val [set] 2.查看当前redi…...

时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比

时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比 目录 时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比效果一览基本描述程序设计参考资料 效果一览 基本描述 1.时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测&#xff1b; 2.单变量时间序列数…...

Unity3D下如何采集camera场景数据并推送RTMP服务?

Unity3D使用场景 Unity3D是非常流行的游戏开发引擎&#xff0c;可以创建各种类型的3D和2D游戏或其他互动应用程序。常见使用场景如下&#xff1a; 游戏开发&#xff1a;Unity3D是一个广泛用于游戏开发的环境&#xff0c;适用于创建各种类型的游戏&#xff0c;包括动作游戏、角…...

黑客可利用 Windows 容器隔离框架绕过端点安全系统

新的研究结果表明&#xff0c;攻击者可以利用一种隐匿的恶意软件检测规避技术&#xff0c;并通过操纵 Windows 容器隔离框架来绕过端点安全的解决方案。 Deep Instinct安全研究员丹尼尔-阿维诺姆&#xff08;Daniel Avinoam&#xff09;在本月初举行的DEF CON安全大会上公布了…...

STM32注入通道

什么是注入通道? 注入通道是ADC的一种采样方式,主要用于在规则通道转换期间并行处理快速变化信号的采样。注入通道的转换可以在规则通道转换时强行插入,相当于一个“中断通道”。当有注入通道需要转换时,规则通道的转换会停止,优先执行注入通道的转换,当注入通道的转换执…...

WebVR — 网络虚拟现实

推荐&#xff1a;使用 NSDT编辑器 快速搭建3D应用场景 虚拟现实设备 随着Oculus Rift和许多其他生产设备即将上市&#xff0c;未来看起来很光明——我们已经有足够的技术来使VR体验“足够好”&#xff0c;可以玩游戏。有许多设备可供选择&#xff1a;像Oculus Rift或HTC Vive这…...

ASP.NET Core 的 Routing

ASP.NET Core 的 Routing ASP.NET Core 的 controllers 使用Routing 中间件匹配客户端的 url 请求&#xff0c;然后映射到对应的 controller 的处理方法&#xff08;Action&#xff09;上。 Actions 可以是 常规路由 或 属性路由 的映射。 MVC App一般使用常规路由。 REST API…...

IBM Spectrum LSF Explorer 为要求苛刻的分布式和任务关键型高性能技术计算环境提供强大的工作负载管理

IBM Spectrum LSF Explorer 适用于 IBM Spectrum LSF 集群的强大、轻量级报告解决方案 亮点 ● 允许不同的业务和技术用户使用单一解决方案快速创建和查看报表和仪表板 ● 利用可扩展的库提供预构建的报告 ● 自定义并生成性能、工作负载和资源使用情况的报…...

RHCE——十一、NFS服务器

NFS服务器 一、简介1、NFS背景介绍2、生产应用场景 二、NFS工作原理1、示例图2、流程 三、NFS的使用1、安装2、配置文件3、主配置文件分析3.1 实验1 4、NFS账户映射4.1 实验24.2 实验3 四、autofs自动挂载服务1、产生原因2、安装3、配置文件分析4、实验45、实验5 一、简介 1、…...

Python编程练习与解答 练习100:随机密码

编写一个生成最忌密码的函数&#xff0c;密码的长度应该在7-10个字符之间。每个字符应该从ASCII表的第33位到126位中随机选择。函数不接受任何参数&#xff0c;返回随机生成的密码作为位移结果。在文件的main程序中显示随机生成的密码。main程序只在解答没有被导入另一个文件时…...

华为云云服务器评测 | 从零开始:云耀云服务器L实例的全面使用解析指南

文章目录 一、前言二、云耀云服务器L实例要点介绍2.1 什么是云耀云服务器L实例2.1.1 浅析云耀云服务器L实例 2.2 云耀云服务器L实例的产品定位2.3 云耀云服务器L实例优势2.4 云耀云服务器L实例支持的镜像与应用场景2.5 云耀云服务器L实例与弹性云服务器&#xff08;ECS&#xf…...

欧科云链研究院探析Facebook稳定币发行经历会不会在PayPal重演

引言 作者最近的报告-探析PayPal发行稳定币是否会重蹈Facebook覆辙-近期被英国的金融时报&#xff08;中文版&#xff09;刊登。由于该报告在欧科云链研究院内部反响较好&#xff0c;下面就带大家简单的剖析这篇报告的主要内容。 *这篇文章主要由对比分析&#xff08;已删减&a…...

docker 容器pip、git安装异常;容器内web对外端口ping不通

1、docker 容器pip、git安装异常 错误信息&#xff1a; git clone https://github.com/vllm-project/vllm.git Cloning into ‘vllm’… fatal: unable to access ‘https://github.com/vllm-project/vllm.git/’: Failed to connect to 127.0.0.1 port 10808: Connection ref…...

SpringBoot Mybatis 多数据源 MySQL+Oracle+Redis

一、背景 在SpringBoot Mybatis 项目中&#xff0c;需要连接 多个数据源&#xff0c;连接多个数据库&#xff0c;需要连接一个MySQL数据库和一个Oracle数据库和一个Redis 二、依赖 pom.xml <dependencies><dependency><groupId>org.springframework.boot&l…...

【JavaScript 16】对象继承 原型对象属性 原型链 构造函数属性 instanceof运算符 继承 多重继承 模块

对象继承 原型对象概述instanceof运算符构造函数的继承多重继承模块 A 对象通过继承 B 对象&#xff0c;就能 直接拥有 B 对象的所有属性和方法&#xff08;利于代码复用&#xff09; 大部分面向对象的编程语言都是通过类&#xff08;class&#xff09;实现对象的继承 但 传统…...

地下管线三维自动建模软件MagicPipe3D V3.0发布

2023年9月1日经纬管网建模系统MagicPipe3D V3.0正式发布&#xff0c;该版本经过众多用户应用和反馈&#xff0c;在三维地下管线建模效果、效率、适配性等方面均有显著提升&#xff01;MagicPipe3D本地离线参数化构建地下管网模型&#xff08;包括管道、接头、附属设施等&#x…...

百度等8家企业首批上线大模型服务;大语言模型微调之道

&#x1f989; AI新闻 &#x1f680; 百度等8家企业首批上线大模型服务 摘要&#xff1a;百度、字节、中科院旗下8家企业/机构的大模型通过备案&#xff0c;正式面向公众提供服务。百度旗下AI大模型产品文心一言率先开放&#xff0c;用户可下载App或登录官网体验。百川智能也…...

瑞芯微RK3568与RK3399深度对比:选型指南与实战解析

1. 项目概述&#xff1a;一次关于“芯”的深度对话 最近在选型嵌入式开发板时&#xff0c;很多朋友&#xff0c;尤其是刚入行或准备从传统方案转向国产平台的朋友&#xff0c;都会在瑞芯微的RK3568和RK3399这两颗明星处理器之间纠结。手头正好有迅为基于这两颗芯片的开发板&…...

curtains.js数学工具详解:Vec2、Vec3、Mat4和Quat的使用方法

curtains.js数学工具详解&#xff1a;Vec2、Vec3、Mat4和Quat的使用方法 【免费下载链接】curtainsjs curtains.js is a lightweight vanilla WebGL javascript library that turns HTML DOM elements into interactive textured planes. 项目地址: https://gitcode.com/gh_m…...

急救场景下的志愿者调度与AED就近匹配

急救场景下的志愿者调度与AED就近匹配——120急救通的设计思路 一、问题的起点&#xff1a;黄金4分钟 心脏骤停后&#xff0c;每延迟1分钟&#xff0c;存活率下降7%-10%。医学上公认的黄金抢救时间是4分钟。 而现实是&#xff1a;城市中120救护车平均到达时间超过10分钟&#x…...

CANN ops-transformer 的 FlashAttention:把大模型的记忆从 32GB 压到 8GB,怎么做到的

刚接触昇腾CANN那会&#xff0c;我以为 ops-transformer 就是个普通的算子仓库&#xff0c;和 ops-math、ops-nn 没什么区别。后来跑一个 70B 模型的推理任务&#xff0c;显存直接爆了&#xff0c;才发现大模型的注意力计算才是真正的吞显存怪兽——而 ops-transformer 里那个 …...

微信虚拟支付求支招

最近微信小程序不是要求必须接入虚拟支付吗&#xff0c;然后我们接入了&#xff0c;并走通了流程。但是&#xff01;&#xff01;使用其它体验极差&#xff0c;具体如下&#xff1a; 1.这块的开发流程手册&#xff0c;狗看了都摇头。我看着流程自己理解的意思是&#xff0c;我们…...

STM32开发库选型指南:标准库、HAL库与LL库的深度对比与实战应用

1. 项目概述&#xff1a;从寄存器到库&#xff0c;STM32开发的演进之路十年前&#xff0c;当我第一次接触STM32时&#xff0c;面对的是密密麻麻的寄存器手册和几百页的参考手册&#xff0c;一个简单的GPIO点灯操作都需要配置好几个寄存器。那时候&#xff0c;标准库&#xff08…...

Agent工程2026:从提示词堆砌到生产级智能体的完整跃迁路径

如果你今天还在用"给LLM加几个工具调用"来描述你的Agent&#xff0c;那我们需要认真谈谈了。 2026年的AI工程现实是&#xff1a;绝大多数Agent项目死在了从Demo到生产的路上。不是因为模型不够强&#xff0c;而是因为工程没跟上。本文会系统梳理Agent工程化的核心路…...

指纹采集器模块选型指南|如何选择合适的指纹采集模块

在做指纹门禁、指纹考勤、指纹保险箱或嵌入式终端时&#xff0c; 指纹采集器模块几乎是整个系统的核心。 模块选对了&#xff0c;项目推进顺畅&#xff1b;选错了&#xff0c;后期调试、售后问题不断。 本文不讲复杂参数&#xff0c;只从实际应用出发&#xff0c; 用最通俗的方…...

Android 开发问题:TextView 内容超过宽度时,默认不会换行

在 Android 开发&#xff0c;TextView 内容超过宽度时&#xff0c;默认不会换行&#xff0c;如下例 <TextViewandroid:layout_width"200dp"android:layout_height"wrap_content"android:text"这是一段很长的文本&#xff0c;这是一段很长的文本&am…...

(最新版)GitGitHub实操图文详解教程(09)—git log命令

版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 1. 应用场景 git log用于查看项目的提交历史。前面我们已经学习了git add和git commit,其中git commit会将暂存区中的内容保存为一次正式提交。随着项目不断开发,本地仓库中会逐渐产生多次提交…...