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

【MySQL】使用C语言链接

🌈 个人主页:Zfox_
🔥 系列专栏:MySQL

目录

  • 一:🔥 MySQL connect
    • 🦋 Connector / C 使用
    • 🦋 mysql 接口介绍
    • 🦋 完整代码样例
  • 二:🔥 共勉

一:🔥 MySQL connect

📚 MySQL 的基础,我们之前已经学过,后面我们只关心使用
要使用 C 语言连接 MySQL,需要使用 MySQL 官网提供的库,大家可以去官网下载
我们使用 C接口库来进行连接
要正确使用,我们需要做一些准备工作:

  • 保证 mysql 服务有效
  • 在官网上下载合适自己平台的 MySQL connect 库,以备后用
  • 建议直接使用命令 sudo yum install -y mysql-community-server 安装

🦋 Connector / C 使用

  • 📚 我们下下来的库格式如下:
# tree /usr/include/mysql
/usr/include/mysql
├── client_plugin.h
├── errmsg.h
├── field_types.h
├── my_command.h
├── my_compress.h
├── my_list.h
├── mysql_com.h
├── mysqld_error.h
├── mysql.h
├── mysql_time.h
├── mysql_version.h
├── mysqlx_ername.h
├── mysqlx_error.h
├── mysqlx_version.h
├── plugin_auth_common.h
└── udf_registration_types.hlib
# find /usr -name "libmysqlclient*"
/usr/share/doc/libmysqlclient21
/usr/share/doc/libmysqlclient-dev
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.21.2.40
/usr/lib/x86_64-linux-gnu/libmysqlclient.a
/usr/lib/x86_64-linux-gnu/libmysqlclient.so
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.21

📚 其中 include 包含所有的方法声明, lib 包含所有的方法实现(打包成库)

尝试链接 mysql client

通过 mysql_get_client_info() 函数,来验证我们的引入是否成功

#include <iostream>
#include <mysql/mysql.h>int main()
{std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;return 0;
} $ g++ -o mytest test.cc -std=c++11 -lmysqlclient
$ ls
Makefile  mytest  test.cc$ ./mytest 
mysql client version: 8.0.40

至此引入库的工作已经做完,接下来就是熟悉接口

🦋 mysql 接口介绍

🦁 MySQL官方文档借口介绍

在这里插入图片描述

  • 初始化 mysql_init()

要使用库,必须先进行初始化!

初始化一个 MYSQL对象 
MYSQL *mysql_init(MYSQL *mysql);使用 mysql_init函数初始化一个 MySQL 连接句柄,为后续操作做准备。
如: MYSQL *mfp = mysql_init(NULL)
  • 链接数据库 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);//建立好链接之后,获取英文没有问题,如果获取中文是乱码:
//设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8");

第一个参数 MYSQL是 C api 中一个非常重要的对象(mysql_init的返回值),里面内存非常丰富,有
port, dbname, charset 等连接基本参数。它也包含了一个叫 st_mysql_methods 的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。
mysql_real_connect 函数中各参数,基本都是顾名思意。

📚 测试:

#include <iostream>
#include <unistd.h>
#include <string>
#include <mysql/mysql.h>const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string passwd = "123456";
const std::string db = "conn";
const unsigned int port = 3306;int main()
{std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;MYSQL* my = mysql_init(nullptr);if(my == nullptr){std::cerr << "init MySQL error" << std::endl;return 1;}if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){std::cerr << "connect MYSQL error" << std::endl;return 2;}std::cout << "connect success" << std::endl;mysql_set_character_set(my, "utf8");    // 设置字符集mysql_close(my);return 0;
}

📚 结果:

# ./mytest 
mysql client version: 8.0.40
connect success

下发 mysql 命令 mysql_query

int mysql_query(MYSQL *mysql, const char *q);

第一个参数上面已经介绍过,第二个参数为要执行的sql语句,如“select * from table”。
获取执行结果 mysql_store_result sql 执行完以后,如果是查询语句,我们当然还要读取数据,如果 update,insert 等语句,那么就看下操作成功与否即可。

#include <iostream>
#include <unistd.h>
#include <string>
#include <mysql/mysql.h>const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string passwd = "123456";
const std::string db = "conn";
const unsigned int port = 3306;int main()
{std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;MYSQL* my = mysql_init(nullptr);if(my == nullptr){std::cerr << "init MySQL error" << std::endl;return 1;}if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){std::cerr << "connect MYSQL error" << std::endl;return 2;}std::cout << "connect success" << std::endl;mysql_set_character_set(my, "utf8");    // 设置字符集std::string sql;while(true){std::cout << "MySQL>>> ";if(!std::getline(std::cin, sql) || sql == "quit") {std::cout << "bye bye" << std::endl;break;}int n = mysql_query(my, sql.c_str());if(n == 0){std::cout << sql << " success: " << n << std::endl;}else{std::cerr << sql << " failed" << n << std::endl;}} mysql_close(my);return 0;
}

我们来看看如何获取查询结果: 如果 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
获取结果列数 mysql_num_fields
获取列名 mysql_fetch_fields
如:

	int fields = mysql_num_fields(res);MYSQL_FIELD *field = mysql_fetch_fields(res);for(int i = 0; i < fields; i++){cout<<field[i].name<<" ";} 

获取结果内容mysql_fetch_row
它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **. 就当成一个二维数组来用吧

	MYSQL_ROW line;for(i = 0; i < nums; i++){line = mysql_fetch_row(res);for(int j = 0; j < fields; j++){cout << line[j] << " ";} }

🦋 完整代码样例

#include <iostream>
#include <unistd.h>
#include <string>
#include <mysql/mysql.h>const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string passwd = "123456";
const std::string db = "conn";
const unsigned int port = 3306;int main()
{std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;MYSQL* my = mysql_init(nullptr);if(my == nullptr){std::cerr << "init MySQL error" << std::endl;return 1;}if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){std::cerr << "connect MYSQL error" << std::endl;return 2;}std::cout << "connect success" << std::endl;mysql_set_character_set(my, "utf8");    // 设置字符集//std::string sql = "update user set name='Jimmy' where id=2";//std::string sql = "insert into user (name, age, telphone) values ('peter', 19, 6543219876)";std::string sql = "select * from user";int n = mysql_query(my, sql.c_str());if(n == 0)  std::cout << sql << " success" << std::endl;else {std::cerr << sql << " failed" << std::endl;return 3;}MYSQL_RES *res = mysql_store_result(my);if(res == nullptr){std::cerr << "mysql_store_result error" << std::endl;return 4;}my_ulonglong rows = mysql_num_rows(res);my_ulonglong fields = mysql_num_fields(res);std::cout << "行: " << rows << std::endl;std::cout << "列: " << fields << std::endl;// 属性MYSQL_FIELD *fields_array = mysql_fetch_fields(res);for(int i = 0; i < fields; i++){std::cout << fields_array[i].name << '\t';}std::cout << '\n';// 内容for(int i = 0; i < rows; i++){MYSQL_ROW row = mysql_fetch_row(res);       // mysql_fetch_row相当于一个迭代器,会自动向后遍历  MYSQL_ROW 就是一个 char** 的二级指针for(int j = 0; j < fields; j++){std::cout << row[j] << '\t';}std::cout << '\n';}mysql_free_result(res);mysql_close(my);return 0;
}

📚 关闭 mysql 链接 mysql_close

void mysql_close(MYSQL *sock);

📚 另外,mysql C api 还支持事务等常用操作,大家下来自行了解:

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

或者直接通过query函数直接操作都可以

二:🔥 共勉

以上就是我对 【MySQL】使用C语言链接 的理解,觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~😉
在这里插入图片描述

相关文章:

【MySQL】使用C语言链接

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;MySQL 目录 一&#xff1a;&#x1f525; MySQL connect &#x1f98b; Connector / C 使用&#x1f98b; mysql 接口介绍&#x1f98b; 完整代码样例 二&#xff1a;&#x1f525; 共勉 一&#…...

Vue篇-07

Vue UI组件库 一、移动端常用的UI组件库 1.1、Vant 1.2、Cube UI 1.3、Mint UI 二、PC端常用的UI组件库 2.1、Element UI Element - The worlds most popular Vue UI framework 安装&#xff1a; 按需引入&#xff1a; 135_尚硅谷Vue技术_element-ui按需引入_哔哩哔哩_b…...

使用 LLaMA-Factory 微调大模型

本文将介绍如下内容&#xff1a; 一、搭建 Docker Container 环境二、配置大模型训练环境三、构建、配置数据集四、训练大模型 一、搭建 Docker Container 环境 笔者此前多篇文章说明&#xff0c;此处不再赘述&#xff0c;可参考&#xff1a;NGC容器中快速搭建Jupyter环境 E…...

数据仓库的复用性:模型层面通用指标体系、参数化模型、版本化管理

在数据仓库设计中&#xff0c;复用性 是一个关键原则&#xff0c;它不仅能提升数据资产的使用效率&#xff0c;还能降低开发成本、优化系统运维。下面将从 模型层面的复用性、通用指标体系、参数化模型、版本化管理 四个方面进行详细介绍&#xff0c;并提供可落地的设计方案。 …...

Web APP 阶段性综述

Web APP 阶段性综述 当前&#xff0c;Web APP 主要应用于电脑端&#xff0c;常被用于部署数据分析、机器学习及深度学习等高算力需求的任务。在医学与生物信息学领域&#xff0c;Web APP 扮演着重要角色。在生物信息学领域&#xff0c;诸多工具以 Web APP 的形式呈现&#xff…...

某国际大型超市电商销售数据分析和可视化

完整源码项目包获取→点击文章末尾名片&#xff01; 本作品将从人、货、场三个维度&#xff0c;即客户维度、产品维度、区域维度&#xff08;补充时间维度与其他维度&#xff09;对某国际大型超市的销售情况进行数据分析和可视化报告展示&#xff0c;从而为该超市在弄清用户消费…...

电子杂志制作平台哪个好

​作为一个热爱分享的人&#xff0c;我试过了好几个平台&#xff0c;终于找到了几款比较好用得电子杂志制作平台&#xff0c;都是操作界面很简洁&#xff0c;上手非常快的工具。 FLBOOK:这是一款在线制作H5电子画册软件&#xff0c;提供了各种类型的模板&#xff0c;可支持添加…...

Django Admin 实战:实现 ECS 集群批量同步功能

引言 在管理大规模 AWS ECS (Elastic Container Service) 集群时,保持本地数据库与 AWS 实际状态的同步是一项关键任务。手动更新既耗时又容易出错,因此自动化这个过程变得尤为重要。本文将介绍如何利用 Django Admin 的自定义动作功能来实现 ECS 集群的批量同步操作,从而大…...

虚拟拨号技术(GOIP|VOIP)【基于IP的语音传输转换给不法分子的境外来电披上一层外衣】: Voice over Internet Protocol

文章目录 引言I 虚拟拨号技术(GOIP|VOIP)原理特性:隐蔽性和欺骗性II “GOIP”设备原理主要功能III 基于IP的语音传输 “VOIP” (Voice over Internet Protocol)IV “断卡行动”“断卡行动”目的电信运营商为打击电诈的工作V 知识扩展虚拟号保护隐私虚拟运营商被用于拨打骚扰…...

迅为RK3576开发板Android 多屏显示

迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片&#xff0c;集成了4个Cortex-A72和4个Cortex-A53核心&#xff0c;以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。 1.1 Android 多屏同显 iTOP-RK3576 开发板支持…...

cmake + vscode + mingw 开发环境配置

1.软件准备 准备如下软件&#xff1a; mingw64&#xff08;安装完成之后检测是否有环境变量&#xff0c;如果没有需要配置&#xff09; cmake&#xff08;安装完成之后检测是否有环境变量&#xff0c;如果没有需要配置&#xff09; vscode&#xff08;安装CMake插件&#xff0…...

nginx 配置代理,根据 不同的请求头进行转发至不同的代理

解决场景&#xff1a;下载发票的版式文件&#xff0c;第三方返回的是url链接地址&#xff0c;但是服务是部署在内网环境&#xff0c;无法访问互联网进行下载。此时需要进行走反向代理出去&#xff0c;如果按照已有套路&#xff0c;就是根据不同的访问前缀&#xff0c;跳转不同的…...

类模板的使用方法

目录 类模板的使用方法 1.类模板语法 2.类模板和函数模板区别 3.类模板中成员函数创建时机 4.类函数对象做函数参数 5.类模板和继承 6.类模板成员函数类外实现 7.类模板分文件编写 person.hpp 实现cpp文件&#xff1a; 8.类模板与友元 9.类模板案例 MyArray.hpp …...

高级Python Web开发:FastAPI的前后端集成与API性能优化

高级Python Web开发&#xff1a;FastAPI的前后端集成与API性能优化 目录 &#x1f6e0;️ 前后端集成的基本原理与实践&#x1f680; FastAPI的API设计与实现&#x1f4c8; API性能测试与负载测试 &#x1f4ca; 使用Locust进行API性能测试&#x1f4a5; 使用Apache JMeter进…...

期权懂|期权的溢价率和杠杆率有什么区别?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 期权的溢价率和杠杆率有什么区别&#xff1f; 一、定义篇 期权溢价率&#xff1a;这是一个细腻地描绘了期权价格与其内在价值之间微妙差异的指标。想象一下&#xff0c;期权价格就…...

分布式ID的实现方案

1. 什么是分布式ID ​ 对于低访问量的系统来说&#xff0c;无需对数据库进行分库分表&#xff0c;单库单表完全可以应对&#xff0c;但是随着系统访问量的上升&#xff0c;单表单库的访问压力逐渐增大&#xff0c;这时候就需要采用分库分表的方案&#xff0c;来缓解压力。 ​…...

Py之cv2:cv2(OpenCV,opencv-python)库的简介、安装、使用方法(常见函数、图像基本运算等)

1. OpenCV简介 1.1 OpenCV定义与功能 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它为计算机视觉应用程序提供了一个通用的基础设施&#xff0c;并加速了在商业产品中使用机器感知。作为BSD许可的产品&…...

如何学习网络安全?有哪些小窍门?

学好网络安全其实没有所谓的捷径&#xff0c;也没有什么小窍门。 入门网络安全首先要有浓厚的学习兴趣&#xff0c;不然很容易就变成了从入门到放弃了。 其次要能静下心&#xff0c;踏踏实实的打好基础。如果你是零基础&#xff0c;建议从Web安全入手&#xff0c;课程难度相对…...

Dart语言的数据结构

Dart语言中的数据结构探讨 引言 Dart是一种现代化的编程语言&#xff0c;主要用于构建移动应用、Web应用和服务端应用。随着应用程序的复杂性日益增加&#xff0c;选择合适的数据结构显得尤为重要。数据结构不仅影响程序的性能&#xff0c;也影响程序的可维护性和可扩展性。本…...

TabPFN - 表格数据基础模型

文章目录 一、关于 TabPFN&#x1f310;TabPFN生态系统 二、快速入门&#x1f3c1;1、安装2、基本用法 三、使用技巧&#x1f4a1;四、开发&#x1f6e0;️1、设置环境2、在提交之前3、运行测试 一、关于 TabPFN TabPFN是表格数据的基础模型&#xff0c;它优于传统方法&#x…...

AOF日志:宕机了Redis如何避免数据丢失?

文章目录 AOF 日志是如何实现的&#xff1f;三种写回策略日志文件太大了怎么办&#xff1f;AOF 重写会阻塞吗?小结每课一问 更多redis相关知识 如果有人问你&#xff1a;“你会把 Redis 用在什么业务场景下&#xff1f;”我想你大概率会说&#xff1a;“我会把它当作缓存使用&…...

MAC上安装Octave

1. 当前最新版Octave是9.3版本&#xff0c;需要把mac os系统升级到14版本&#xff08;本人之前的版本是10版本&#xff09; https://wiki.octave.org/Octave_for_macOS octave的历史版本参考此文档&#xff1a;Octave for macOS (outdated) - Octavehttps://wiki.octave.org/Oc…...

C 语言中二维数组的退化

目录 1. 一维数组的退化 2.字符串数组的退化 3. 二维数组的退化 3.1 为什么退化为 int (*)[4] 而不是 int **&#xff1f; 3.2举例说明 3.3 .总结 在 C 语言中&#xff0c;数组名在大多数情况下会退化为指向其第一个元素的指针&#xff0c;这种机制称为数组退化&#xf…...

Notion 推出捏脸应用 | Deving Weekly #15

CEF-Detector-X 现在 Chromium 占据了桌面应用的大壁江山&#xff0c;典型的有 Electron 框架&#xff0c;底层就是基于 Chromium 内核&#xff0c;上百 M 的臃肿包体积一直别人诟病。 CEF-Detector-X 可以检测你电脑有多少个 基于 Chromium 应用&#xff0c;并且会生成一份「…...

C# Linq 查询

1.Linq 查询表达式基础 Linq 查询应用程序始终将源数据视为 IEnumerable<T> 或 IQueryable<T> 集合。 LINQ查询表达式包含8个基本子句,分别为from、select、group、where、orderby、join、let和into。 子 句备注from指定数据源和范围变量select指定当执行查询…...

ES7【2016】、ES8【2017】新增特性

ES7【2016】新增特性 幂指数操作符 在ES7【2016】中新增了幂指数操作&#xff0c;幂指数操作符是**。它用于指数计算 基本语法&#xff1a;baseValue ** exponent 参数说明&#xff1a;baseValue是基数&#xff0c;exponent是指数。 let base 2; let exponent 4; let resul…...

64细分步进电机驱动器TMC2209

封装和丝印 典型电路1 典型电路2 应用 兼容设计升级 3D 打印机 打印机、POS 办公和家庭自动化 纺织、缝纫机 闭路电视&#xff0c; 安保 ATM&#xff0c; 现金回收机 暖 通 空调 电池供电设备 特点和优势 2 相步进电机&#xff0c;线圈电流&#xff08;峰值&#xff09;高达…...

C# 获取PDF文档中的字体信息(字体名、大小、颜色、样式等

在设计和出版行业中&#xff0c;字体的选择和使用对最终作品的质量有着重要影响。然而&#xff0c;有时我们可能会遇到包含未知字体的PDF文件&#xff0c;这使得我们无法准确地复制或修改文档。获取PDF中的字体信息可以解决这个问题&#xff0c;让我们能够更好地处理这些文件。…...

linux 安装PrometheusAlert配置钉钉告警

在 Linux 上安装 PrometheusAlert 并配置钉钉告警的步骤如下: 1. 准备工作 钉钉机器人: 在钉钉群中创建一个机器人,获取 Webhook URL。示例 Webhook URL:https://oapi.dingtalk.com/robot/send?access_token=your_dingtalk_token。PrometheusAlert 安装包: 从 Prometheus…...

【华为路由/交换机的ssh远程设置】

华为路由/交换机的ssh远程设置 R1&#xff08;client&#xff09;&#xff1a;10.1.1.1 R2&#xff08;server&#xff09;&#xff1a;10.1.1.2 R2服务端配置&#xff1a; 生成本机密钥 查看生成的密钥 设置AAA授权验证方式&#xff0c;并设置支持SSH协议 创建本地用户&…...