MySQL Connect

文章目录

  • 前言
  • 一、Connector/C使用
    • 1、下载MySQL连接所需库
      • 第一种方法
      • 第二种方法
    • 2、MySQL库链接
    • 3、MySQL接口介绍
      • 连接
      • 执行sql语句
      • 执行查询语句


前言


一、Connector/C使用

MySQL数据库的基础知识我们前面已经学习了,下面我们就开始学习怎么将MySQL数据库和我们学习的C/C++等语言连接。要使用C语言连接mysql,需要使用mysql官网提供的库。

1、下载MySQL连接所需库

第一种方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将文件下载解压好就是这样的,我们上传到远端的Linux服务器中。
在这里插入图片描述
include目录里面是连接数据库的头文件,lib目录里面是对应的动静态库。
在这里插入图片描述
上面的这种方法我们现在一般不使用了。

第二种方法

我们在安装MySQL数据库的时候其实已经将对应的开发包也一并下载了。所以我们就不需要再像第一种方法一样去官网下载对应的连接库了。其中 include 包含所有的方法声明, lib 包含所有的方法实现(打包成库)
注意:如果我们在/usr/include目录下没有找到mysql目录,那么是因为我们安装MySQL时并没有给我们将开发包下载了,此时我们可以执行下面的语句来手动将开发包下载。需要下载和当前数据库版本匹配的开发包。

sudo yum install -y mysql-community-devel-5.7.44-1.el7.x86_64

在这里插入图片描述
然后我们就可以在下面的两个目录中查看到开发包中的头文件和对应的动静态库了。
在这里插入图片描述

2、MySQL库链接

下面我们来通过调用mysql.h中提供的mysql_get_client_info()函数来验证我们是否成功引入MySQL连接库。
因为程序执行时会去/usr/include目录下查找头文件,所以我们在引入mysql.h头文件时,只需要指定mysql.h头文件在mysql目录下即可。
在这里插入图片描述
然后我们直接使用g++编译器进行编译时,发现出现了错误,这是因为我们只引入了mysql.h头文件,并没有在编译时连接到mysqlclient库,所以我们在编译时还需要手动链接到mysqlclient库。但是我们看到手动链接mysqlclient库后也出现了错误,这是因为我们没有告诉g++编译器mysqlclient库在哪个目录下,所以g++编译器会去默认的/usr/bin目录下找,如果找不到就报出错误,所以我们编译时还需要告诉g++除了去/usr/bin目录下找之外,还要去/lib64/mysql目录下找mysqlclient,这样才可以将test.cc文件编译成功。我们看到执行生成的可执行程序后,我们使用ldd命令查看可执行程序链接的库,可以看到mysqlclient被成功链接并使用。
在这里插入图片描述
如果我们在编写代码时,引入头文件时不想要使用/mysql/mysql.h,而想要直接使用mysql.h引入头文件,那么我们在使用g++编译时,就需要告诉g++编译器去mysql.h头文件所在的目录去查找头文件。
在这里插入图片描述
在这里插入图片描述

3、MySQL接口介绍

连接

对于MySQL链接库中接口的使用,我们可以查阅官方文档。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在MySQL的文档中,我们看到MySQL还构建了一些结构体,为了更好的使用接口函数。
在这里插入图片描述
我们想要使用MySQL库,就必须先进行初始化,即需要先调用mysql_init函数来进行初始化。我们看到mysql_init()函数返回一个MYSQL类型指针,并且如果没有初始化成功,那么这个函数会返回NULL。MYSQL是 C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。
在这里插入图片描述
在这里插入图片描述
然后我们再使用mysql_real_connect函数来链接数据库。
在这里插入图片描述
我们需要注意当初始化了MySQL对象之后,在代码的最后也要释放MySQL对象,因为MySQL库底层使用了资源,如果我们不进行释放,那么就造成资源泄漏。host为127.0.0.1和为localhost都表示本地登录。
在这里插入图片描述
然后我们编写一个makefile文件来编译,当我们运行程序时,我们看到MySQL连接失败。
在这里插入图片描述
在这里插入图片描述
这时我们可以先看一下mysqld服务器进程是否在运行中,我们看到mysqld进程在运行中。然后我们使用root用户登录mysql发现并没有conn数据库,所以才会连接失败。并且我们看到并没有connector用户。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面我们创建conn数据库,并且创建connector用户。需要注意的是我们还需要给connector用户关于conn数据库的权限,因为这样connector用户才可以访问到conn数据库。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后我们看到我们写的程序就连接mysqld服务器成功了,此时这个程序就也是mysql的一个客户端。
在这里插入图片描述
如果我们此时将mysqld服务器关闭了,那么再运行这个程序就会连接数据库失败,因为mysqld服务器已经关闭了。
在这里插入图片描述
下面我们在代码中连接数据库后,让程序10s后退出,我们来观察数据库的连接情况。可以看到当程序启动后,那么mysql就多了一个客户端连接。
在这里插入图片描述
在这里插入图片描述

执行sql语句

我们可以通过调用mysql_query函数来在代码中下发mysql命令。该函数的第一个参数为mysql_init函数的返回值,第二个参数为要执行的sql语句,如“select * from table”。
在这里插入图片描述
我们先在conn数据库中创建一个user表。
在这里插入图片描述
然后我们来简单实现一个类似于mysql命令行客户端的程序。
在这里插入图片描述
然后我们运行程序,可以看到通过mytest程序向user表中插入了数据。这样我们就实现了一个最简单的MySQL客户端程序。
在这里插入图片描述
下面我们修改user表中的数据。
在这里插入图片描述
在这里插入图片描述
然后我们再试着向表中插入数据和删除数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们前面都是向user表中插入英文数据,如果我们插入中文数据时,我们看到出现了乱码。
在这里插入图片描述
在这里插入图片描述
这是因为客户端和MySQL建立的链接默认使用的字符集是latin1,即在MySQL中将latin1字符集使用utf8字符集进行解码,所以出现了乱码。我们可以通过mysql_set_character_set()函数来设置链接的默认字符集是utf8。

mysql_set_character_set(my, "utf8");

在这里插入图片描述
然后我们看到中文数字也不会出现乱码了。
在这里插入图片描述

执行查询语句

上面我们只执行了增、删、改的sql语句,下面我们来执行查询的sql语句。
在这里插入图片描述
我们看到执行了select语句后,并没有什么反应,select查询到的数据也没有被显示。这是因为我们没有打印select语句查询到的数据。
在这里插入图片描述
当sql执行完以后,如果是查询语句,我们还要读取数据,我们可以通过mysql_store_result这个函数来读取结果。该函数会调用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);
  • 获取结果列数mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
  • 获取列名mysql_fetch_fields
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

在这里插入图片描述
我们看到MYSQL_RES结构体存储select查询的结果就是采用下面的方式存储的。
在这里插入图片描述
然后我们打印select语句显示的结果的行数和列数。
在这里插入图片描述
在这里插入图片描述
如果我们要显示数据,那么可以使用mysql_fetch_row函数。该函数会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **,可以当成一个二维数组来用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们看到上面的数据中没有列相关信息,我们可以通过mysql_fetch_fields函数来获取列相关信息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
fields_array[i]中不止有name属性,还有很多其它的属性,例如下面我们获取user表中id列所在数据库和所在表。
在这里插入图片描述
在这里插入图片描述
我们需要特别注意,当使用MYSQL_RES结构体对象后,需要调用mysql_free_result函数来释放该结构体对象申请的内存资源。因为mysql_store_result函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的调用msql_free_result函数,不然是肯定会造成内存泄漏的。
在这里插入图片描述

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

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

相关文章

代码随想录算法刷题训练营day16

代码随想录算法刷题训练营day16:LeetCode(104)二叉树的最大深度 、LeetCode(559)n叉树的最大深度、LeetCode(111)二叉树的最小深度、LeetCode(222)完全二叉树的节点个数 LeetCode(104)二叉树的最大深度 题目 代码 /*** Definition for a binary tree node.* publ…

架构整洁之道-设计原则

4 设计原则 通常来说,要想构建一个好的软件系统,应该从写整洁的代码开始做起。这就是SOLID设计原则所要解决的问题。 SOLID原则的主要作用就是告诉我们如何将数据和函数组织成为类,以及如何将这些类链接起来成为程序。请注意,这里…

c++24.1.26嵌套if语句

嵌套if语句:if语句中的if语句 实践:

2024最新幻兽帕鲁服务器多少钱一个?

幻兽帕鲁服务器多少钱?价格便宜,阿里云4核16G幻兽帕鲁专属服务器32元1个月、66元3个月,4核32G配置113元1个月、339元3个月;腾讯云4核16G14M服务器66元1个月、277元3个月、1584元一年。阿腾云atengyun.com分享阿里云和腾讯云palwor…

BAT学习笔记:详解环境变量及其所有创建方法

文章目录 一、初识环境变量二、什么是环境变量三、为什么需要环境变量四、环境变量的分类五、环境变量的设置 一、初识环境变量 1.windows 的搜索框中输入 查看高级系统设置。点击打开系统属性窗口。 2. 在系统属性窗口中,点击右下方的“环境变量”打开环境变量设…

RHCE第五次作业

1.写一个脚本,完成如下功能 传递一个参数给脚本,此参数为gzip、bzip2或者xz三者之一; (1) 如果参数1的值为gzip,则使用tar和gzip归档压缩/etc目录至/backups目录中,并命名为/backups/etc-20160613.tar.gz; …

OpenGL 入门(一)— 创建窗口

文章目录 前言创建一个窗口视口动态调整输入控制渲染 完整代码 前言 关键词介绍: OpenGL: 一个定义了函数布局和输出的图形API的正式规范。GLFW:一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许…

C#使用RabbitMQ-2_详解工作队列模式

简介 🍀RabbitMQ中的工作队列模式是指将任务分配给多个消费者并行处理。在工作队列模式中,生产者将任务发送到RabbitMQ交换器,然后交换器将任务路由到一个或多个队列。消费者从队列中获取任务并进行处理。处理完成后,消费者可以向…

C#,打印漂亮杨辉三角形(帕斯卡三角形)的源代码

杨辉 Blaise Pascal 这是某些程序员看完会哭的代码。 杨辉三角形(Yanghui Triangle),是一种序列数值的三角形几何排列,最早出现于南宋数学家杨辉1261年所著的《详解九章算法》一书。 欧洲学者,最先由帕斯卡&#x…

VsCode提高生产力的插件推荐-持续更新中

别名路径跳转 自定义配置// 文件名别名跳转 "alias-skip.mappings": { "~/": "/src", "views": "/src/views", "assets": "/src/assets", "network": "/src/network", "comm…

Go语言指针变量

1. 指针变量 区别于C/C中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。 Go语言中的指针3个概念:指针地址、指针类型和指针取值。 1.1. Go语言中的指针 Go语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候&a…

仓储管理系统——软件工程报告(总体设计)③

总体设计 一、需求规定 软件工程仓库存储管理系统的需求规定是确保系统能够满足用户期望、提高工作效率、确保数据安全性和系统可维护性的基石。其涵盖了功能性、性能、数据管理、用户界面和系统可维护性等多个方面。通过严格的验收标准,可以确保系统在实际应用中…

单片机7-10

目录 定时器 按键控制LED流水灯关键代码 定时器时钟关键代码 串口通信 ​编辑串口向电脑发送数据 电脑通过串口控制LED LED点阵屏 LED点阵屏显示图形 LED点阵屏显示动画 DS1302 DS1302时钟显示 DS1302时钟调节 定时器 为什么12MHz的工作周期为一微秒: 12…

「阿里云」幻兽帕鲁个人服务器已上线,3分钟快速搭建

基于阿里云搭建幻兽帕鲁服务器方法,1到2分钟部署完成,稳定运行无卡顿,阿里云服务器网aliyunfuwuqi.com分享保姆级手把手教程,基于阿里云计算巢、云服务器或无影云桌面都可以: 基于阿里云幻兽帕鲁服务器创建教程 基于…

svn和git的本质区别是什么

参考: https://blog.csdn.net/feiying0canglang/article/details/126550676 上边图中,跨越了区的箭头,它中间的区数据都会同步。例如:git checkout ,它是将本地仓库数据更新到暂存区和工作区的。\ 理解 gitlab和svn都…

网工内推 | 网络安全工程师专场,CISP、HCIE安全认证优先

01 八马茶业 招聘岗位:网络安全工程师 职责描述: 1、负责公司信息安全项目实施及技术支持工作,主要包含信息安全风险检查评估、网络安全设备、服务器及网站日志审查等; 2、应用、服务器和网络架构进行安全检查测试,找…

【MySQL源码】Seconds_Behind_Master是如何计算的

作为MySQL DBA,相信大家对参数 Seconds_Behind_Master 并不陌生,该字段的值可以通过 show slave status\G的输出,表示主从延迟的时间,单位为秒。监控主从延迟一般取这个值就足够了。0 表示无延迟,理想状态该值不要超…

【数据分享】1992-2019年中国水土保持防治能力数据集

土壤数据是在环境、农业、生态等相关研究中都非常常用的数据!我们之前发表过一篇介绍土壤数据来源的文章(可查看之前发布的文章获悉详情)! 水土保持防治能力是土壤的重要属性。本次我们给大家带来的是1992-2019年中国水土保持防治…

vue3 中组合键 command+Enter / shift+Enter / alt + Enter 实现换行,详细实现

vue3 中组合键实现换行 需求背景 有一个聊天室功能,采用输入框的形式,输入完毕使用Enter,可以直接进行发送。使用一些组合键 比如 commandEnter / shiftEnter / alt Enter … 可以实现换行操作。但现实的情况是,原生 Enter 天然…

uniapp安卓android离线打包本地打包整理

离线打包准备 下载Android studio 1.准备资源hbuilder 2.准备离线SDK 最新android平台SDK下载最新android平台SDK下载 3.离线打包key申请 4.直接导入HBuilder-Integrate-AS工程,直接运行simpleDemo项目即可 5.安装java 1.8 jdk-8u151-windows-x64 6.遇到这个报错报错Caus…