MySQL使用C语言链接

news2024/11/26 19:44:40

MySQL使用C语言链接

  • MySQL connect
  • 接口介绍
    • mysql_init
    • mysql_real_connect
    • mysql_query
    • mysql_store_result\mysql_use_result()
    • mysql_num_rows
    • mysql_num_fields
    • mysql_fetch_fields
    • mysql_fetch_row
    • mysql_close

MySQL connect

使用C语言来连接数据库,本质上就是利用一些函数接口来操作数据库,而这些函数接口是由MySQL官方为我们提供的,如果我们想要使用这些接口,我们需要去官方手动下载动态库或者静态库,然后将头文件和动态库或静态库添加到系统默认搜索路劲下或环境变量里面;
https://dev.mysql.com/downloads/installer/
在以上连接中,我们可以下载对应版本的MySQL库;
在这里插入图片描述
如果是在Linux服务器上使用yum安装的MySQL服务,那么在安装的时候会默认将MySQL库资源安装好,我们直接使用就好了:
但是这种情况下,我们可能会在/usr/include/目录下找不到mysql的头文件,只在/usr/lib64/mysql/目录下找到了mysql的库,我们只需要执行一下sudo yum install -y mysql-community-devel.x86_64 就可以了;

接口介绍

对于MySQL的各种接口,官方也给我们提供了文档来查看,我们可以去官网进行查询;

mysql_init

MYSQL *mysql_init(MYSQL *mysql)
描述:
分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。一个MYSQL对象代表一个连接;
返回值:
如果mysql参数为null,那么当返回值为null的时候表示mysql_init()出错,否则mysql_init()成功;
eg:
在这里插入图片描述

mysql_real_connect

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 client_flag)
描述:
mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。
简而言之就是用来链接数据库的!
mysql:就是之前我们使用mysql_init()初始化的MYSQL对象;
host:MySQL服务器所在主机ip;
user:以哪个用户的身份进行登录;
passwd:登录用户的密码;
db:要链接那个数据库;
port:服务器所在端口号;
unix_socket: 不太关心,常设null;
clientflag: 通常设置为:CLIENT_MULTI_STATEMENTS
在这里插入图片描述
返回值:
如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。
eg:
在这里插入图片描述

mysql_query

int mysql_query(MYSQL *mysql, const char *q)
描述:
正常情况下,字符串必须包含1条SQL语句,而且不用为语句添加终结分号(‘;’)或“\g”,当然你非要添加也是没有问题的。如果允许多语句执行,字符串可包含多条由分号隔开的语句;
mysql_query:默认情况下是只允许包含一条SQL语句的,如果想要mysql_query支持包含多条SQL语句,那么我们们在使用对应MYSQL对象建立连接时,需要使用mysql_real_connect函数将clientflag参数设置为:CLIENT_MULTI_STATEMENTS
返回值:
如果查询成功,返回0。如果出现错误,返回非0值。
eg:
注意在使用mysql_query下达SQL语句的时候,需要使用mysql_set_character_set(MYSQL *mysql, char *csname)接口来将我们当前连接的编码格式设置与服务端一致,不然可能会导致后续我们使用mysql_query下达SQL语句,但是数据库却没有反应的情况,或者我们客户端输入的是正常的数据到服务端显示出来的就是乱码;
eg:
在这里插入图片描述
同理:我们也可以下达update语句,比如,我们想要修改id=1的数据的名字:
在这里插入图片描述
同理,我们也可以删除id=2的人:
在这里插入图片描述
现在增、改、查都演示了一遍,那么读呢?
读还不简单,直接向mysql_query下达select语句不就完了?
在这里插入图片描述
我们不是成功执行了select语句吗,那么为什么最后的结果没有给我们显示出来?
实际上,mysqld确实是帮我们成功执行了查询语句,但是最后的查询结果是还保存在mysqld服务器缓冲区中的,如果我们用户需要打印查询成功过后的数据的话,需要我们自己从服务器中获取结果集,然后自己打印;
从服务器获取查询结果的接口有:
mysql_use_result()、mysql_store_result;

mysql_store_result\mysql_use_result()

MYSQL_RES *mysql_store_result(MYSQL *mysql)
MYSQL_RES *mysql_use_result(MYSQL *mysql)
描述:
mysql_store_result:该接口是从服务器缓冲区中一次性将查询结果读取到用户内存中;适合查询结果比较小的结果集,对于过大的查询结果集,不建议使用,有可能因为内存不足而导致获取失败!通常配合mysql_fetch_row接口使用,该接口会自动从内存中获取下一行数据;
mysql_use_result: 这个函数会初始化结果集的检索,但是并不会立即从服务器读取所有的结果,然后,每次调用mysql_fetch_row()函数时,它都会从服务器读取下一行的数据

mysql_store_result与mysql_use_result的区别:

  1. mysql_store_result适合结果集比较小的查询,而mysql_use_result更适合结果集比较大的查询;
  2. 使用mysql_store_result获取的查询结果集,在以后使用上效率是肯定会更快一些的,因为之后的查询都是在内存中进行的,我们只用一次IO就将数据全部读取到内存中了;而反观mysql_use_result在之后的使用上效率肯定会比较低一点,因为对于使用mysql_use_result获取的结果集,我们在想要查询下一行数据时,还需要先从网络中进行获取,然后才能进行读取,IO次数相比于mysql_store_result获取的结果集增多了;
  3. mysql_store_result获取的结果集是支持随机查询的,而mysql_use_result获取的查询结果集是只能按照顺序查询;
  4. mysql_store_result获取的结果集所占内存是比较大的,但是mysql_use_result获取的结果集内存消耗是比较少的;
  5. 无论是mysql_store_result还是mysql_use_result都是从服务器缓存中获取查询结果,具体使用那个接口,根据具体业务场景而定;

在我们执行完查询语句过后,我们应该使用mysql_store_result或者mysql_use_result来获取查询结果,必然这些查询结果会一置消耗着服务器的缓存资源,增加服务器开销!

返回值:
返回null,表示出错;
eg:
在这里插入图片描述
注意: 我们需要自己手动释放MYSQL_RES类型的指针,因为该结果集是mysql_use_result\mysql_store_result函数内部mallc出来的,为此我们每次使用完结果集都需要手动调一下:mysql_free_result比如上图中就是mysql_free_result(res1)(上图中我忘了free了这里手动free一下😘)

mysql_num_rows

my_ulonglong mysql_num_rows(MYSQL_RES *result)
描述:
获取结果集的行数;
返回值:
返回获取到的行数;

mysql_num_fields

unsigned int mysql_num_fields(MYSQL_RES *result)
描述:
获取结果集的列数;
返回值:
返回获取到的列数;

mysql_fetch_fields

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
描述:
获取结果集的所有列的属性;
返回值:
返回关于结果集所有列的MYSQL_FIELD类型数组;
eg:
在这里插入图片描述
在这里插入图片描述

mysql_fetch_row

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
描述:
检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL;在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。
返回值:
下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL。
eg:
在这里插入图片描述
在这里插入图片描述

对于MYSQL_ROW结构的理解:
在这里插入图片描述
通过查看MYSQL_ROW的源码我们可以看到MYSQL_ROW本质上就是一个二级指针;
我们应该如何理解这个二级指针呢?
首先对于每一行数据我们可以这样理解吧:
在这里插入图片描述

mysql_close

void mysql_close(MYSQL *mysql)
描述:
如果mysql对象是由mysql_init创建的话,则回收该资源,并且断开与数据库的连接;
返回值:
无;

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

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

相关文章

「聊设计模式」之命令模式(Command)

🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅! 前言 在面向对象设计中,设计模式是重要的一环。设计…

c:Bubble Sort

/*****************************************************************//*** \file SortAlgorithm.h* \brief 业务操作方法* VSCODE c11* \author geovindu,Geovin Du* \date 2023-09-19 ***********************************************************************/ #if…

前端知识以及组件学习总结

JS 常用方法 js中字符串常用方法总结_15种常见js字符串用法_<a href"#">leo</a>的博客-CSDN博客 <script>var str"heool"console.log(str.length);console.log(str.concat(" lyt"));console.log(str.includes("he&quo…

WebPack5基础使用总结(一)

WebPack5基础使用总结 1、WebPack1.1、开始使用1.2、基本配置 2、处理样式资源2.1、处理Css资源2.2、处理Less资源2.3、处理Sass和Scss资源2.4、处理Styl资源 3、处理图片资源3.1、输出资源情况3.2、对图片资源进行优化 4、修改输出资源的名称和路径4.1、自动清空上次打包资源 …

想了解期权分仓交易和开户?这里告诉你。

期想了解期权分仓交易和开户&#xff1f;这里告诉你。权就是合约交易&#xff0c;通过买卖认购和认沽期权合约实现未来是否能赚钱&#xff0c;具备做多和做空T0双向交易机制&#xff0c;期权分仓开户就是零门槛开通期权账户&#xff0c;下文介绍想了解期权分仓交易和开户&#…

经验分享|作为程序员之后了解到的算法知识

欢迎关注博主 六月暴雪飞梨花 或加入【六月暴雪飞梨花】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术…

Java————栈

一 、栈 Stack继承了Vector&#xff0c;Vector和ArrayList类似&#xff0c;都是动态的顺序表&#xff0c;不同的是Vector是线程安全的。 是一种特殊的线性表&#xff0c; 其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另…

《计算机视觉中的多视图几何》笔记(4)

4 Estimation – 2D Projective Transformations 本章主要估计这么几种2D投影矩阵&#xff1a; 2D齐次矩阵&#xff0c;就是从一个图像中的点到另外一个图像中的点的转换&#xff0c;由于点的表示都是齐次的&#xff0c;所以叫齐次矩阵3D到2D的摄像机矩阵基本矩阵三视图之间的…

基于conda的相关命令

conda 查看python版本环境 打开Anaconda Prompt的命令输入框 查看自己的python版本 conda env list激活相应的python版本(环境&#xff09; conda avtivate python_3.9 若输入以下命令可查看python版本 python -V #注意V是大写安装相应的包 pip install 包名5.查看已安装…

智能井盖:提升城市井盖安全管理效率

窨井盖作为城市基础设施的重要组成部分&#xff0c;其安全管理与城市的有序运行和群众的生产生活安全息息相关&#xff0c;体现城市管理和社会治理水平。当前&#xff0c;一些城市已经将智能化的窨井盖升级改造作为新城建的重要内容&#xff0c;推动窨井盖等“城市部件”配套建…

工控机通过Profinet转Modbus RTU网关连接变频器与电机通讯案例

在工业自动化系统中&#xff0c;工控机扮演着重要的角色&#xff0c;它是数据采集、处理和控制的中心。工控机通过Profinet转Modbus RTU网关连接变频器与电机通讯&#xff0c;为工业自动化系统中的设备之间的通信提供了解决方案。工控机通过Profinet转Modbus RTU网关的方式&…

(leetcode)单值二叉树

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 画图与分析&#xff1a; 题目&#xff1a; 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&…

2023年以就业为目的学习Java还有必要吗?(文末送书)

目录 一、活力四射的 Java二、从零开始学会 Java三、准备工作四、基础知识五、进阶知识六、高级知识七、结语参与方式 大家好&#xff0c;我是哪吒。 文末送5本《Java编程动手学》 今天来探讨一个问题&#xff0c;现在学 Java 找工作还有优势吗&#xff1f; 在某乎上可以看到…

MS1861 视频处理与显示控制器 HDMI转MIPI LVDS转MIPI带旋转功能 图像带缩放,旋转,锐化

1. 基本介绍 MS1861 单颗芯片集成了 HDMI 、 LVDS 和数字视频信号输入&#xff1b;输出端可以驱动 MIPI(DSI-2) 、 LVDS 、 Mini-LVDS 以及 TTL 类型 TFT-LCD 液晶显示。可支持对输入视频信号进行滤波&#xff0c;图 像增强&#xff0c;锐化&#xff0c;对比度调节&am…

ai虚拟主播看车线上虚拟三维展示节约成本和资源

线上车展汽车3D展厅突破了前期虚拟和现实的障碍&#xff0c;使用户无论身在哪个城市&#xff0c;都可以随时随地在线3D看车&#xff0c;极大的方便了消费者的看车的线上体验。因此对企业来说&#xff0c;有购车意愿的顾客必然是会提高成交的可能性&#xff0c;那么如何满足顾客…

固定资产管理系统的特点有哪些

固定资产管理系统是一种用于管理企业固定资产的软件。其功能如下&#xff1a;  自动化管理&#xff1a;固定资产管理系统可自动管理企业固定资产&#xff0c;包括采购、仓储、申请、维护、损坏等流程&#xff0c;大大提高了工作效率。  实时监控&#xff1a;固定资产管理系…

Python 点云处理--半径滤波 【open3d实现】【可视化输出】

目录 一、原理二、环境搭建三、代码实现一、原理 半径滤波以某点为中心画一个圆计算落在该圆中点的数量,当数量大于给定值时,则保留该点,数量小于给定值则剔除该点。因此,使用该算法时需要对搜索半径和近邻点个数阈值进行设置。 二、环境搭建 安装open3d三方库 直接: pi…

准备篇(三)Python 爬虫第三方库

第三方库无法将 "pip" 识别ModuleNotFoundError: No module named pip install 安装路径相关问题requests 库和 BeautifulSoup 库requests 库BeautifulSoup 库第三方库 Python 的 标准库 中提供了许多有用的模块和功能,如字符串处理、网络通信、多线程等,但它们并…

python3.11版本pip install ddddocr调用时报错got an unexpected keyword argument ‘det‘ 解决

一、如图出现如下问题 ddddocr.__init__() got an unexpected keyword argument det出现问题原因&#xff1a;python3.11默认安装版本就旧版的ddddocr1.0的&#xff0c;所以导致如下报错 二、解决方案一&#xff08;推荐&#xff09; python3.11的环境直接安装这个即可&…

我们如何将机器学习应用到 Positive Technologies 产品中

今天&#xff0c;我们将向您介绍 ML 如何帮助安全专家实现自动化操作并检测网络攻击。首先&#xff0c;我们将分析理论基础&#xff0c;然后用我们工作中的案例加以证明。 我们为什么使用 ML 在讨论使用机器学习模型的必要性之前&#xff0c;我们有必要先了解安全工具的工作原…