当前位置: 首页 > 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…...

LLM API安全攻防实战:从提示词注入到自动化测试方案

1. 项目概述&#xff1a;被忽视的LLM API安全前线最近在帮几个团队做上线前的安全审计&#xff0c;发现一个挺有意思的现象&#xff1a;大家对于传统API的鉴权、限流、SQL注入这些常规检查已经形成了肌肉记忆&#xff0c;但一旦涉及到LLM&#xff08;大语言模型&#xff09;的A…...

基于LM22678的树莓派硬盘专用电源设计:解决供电不稳与电流冲击

1. 项目概述&#xff1a;为什么我们需要一个“专用”电源&#xff1f;如果你正在用树莓派搭配一块机械硬盘搭建一个家庭服务器或者个人云存储&#xff0c;可能已经遇到了一个不大不小的麻烦&#xff1a;供电不稳。树莓派官方推荐的5V/3A电源&#xff0c;单独带树莓派4B跑满负载…...

嘈杂工业场景下的自适应VAD与双码本声纹识别鉴权系统:基于端侧轻量化神经网络与向量量化(VQ)重构

在大型化工车间、能源集控中心以及金融极密隔离库房中&#xff0c;离线声纹识别是物理访问控制和身份安全核验的重要生物特征屏障。然而&#xff0c;在环境本底噪声高达80dB以上的恶劣工业场景下&#xff0c;常规的语音活动检测&#xff08;VAD&#xff09;会频繁误触&#xff…...

Windows文件夹共享

目标&#xff1a;同一局域网实现在一台计算机上共享文件夹&#xff0c;在另一台电脑访问一、电脑A 1.点击要共享的文件夹 -> 属性 -> 共享2.添加Everyone用户组3.控制面板中网络共享关闭密码保存&#xff0c;在访问时不用输入账号密码。二、电脑B 1.在文件资源管理器路径…...

Unity渲染排序三要素:SortingLayer、Order in Layer与RenderQueue协同原理

1. 为什么刚进Unity的美术和程序总在“图层遮挡”上反复拉扯&#xff1f;“这个UI怎么被背景挡住了&#xff1f;”“粒子特效一开就穿模&#xff0c;明明Z轴没问题&#xff01;”“我调了Order in Layer到999&#xff0c;还是被另一个Sprite挡住——它连Sorting Layer都没改过&…...

Allegro PCB设计小技巧:如何让Route Keepout区域既能走线又能打过孔(附详细步骤图)

Allegro PCB设计实战&#xff1a;Route Keepout区域的灵活控制技巧 在高速PCB设计中&#xff0c;Route Keepout区域的管理常常让工程师陷入两难境地——元件封装自带的限制区域与实际布线需求产生冲突。特别是处理PCIE等高速信号时&#xff0c;这种矛盾尤为突出。传统做法要么完…...

CSharpVerbalExpressions常见问题解答:解决开发者遇到的10个典型挑战

CSharpVerbalExpressions常见问题解答&#xff1a;解决开发者遇到的10个典型挑战 【免费下载链接】CSharpVerbalExpressions 项目地址: https://gitcode.com/gh_mirrors/cs/CSharpVerbalExpressions CSharpVerbalExpressions是一个强大的C#库&#xff0c;它通过类自然语…...

从无线破解到PDF解密:盘点那些容易被忽略的‘非主流’密码审计场景与工具

密码安全审计的隐秘战场&#xff1a;从无线网络到加密文档的实战指南 当大多数人谈论密码安全时&#xff0c;脑海中浮现的往往是服务器登录、数据库访问这些企业级场景。然而在数字生活的每个角落&#xff0c;从家庭Wi-Fi到工作文档&#xff0c;密码保护的脆弱性同样可能成为安…...

Awoo Installer:让Switch游戏安装变得简单高效的终极解决方案

Awoo Installer&#xff1a;让Switch游戏安装变得简单高效的终极解决方案 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 厌倦了繁琐的Switch游戏安…...

如何高效实现Windows自动化鼠标点击:AutoClicker完整实战指南

如何高效实现Windows自动化鼠标点击&#xff1a;AutoClicker完整实战指南 【免费下载链接】AutoClicker AutoClicker is a useful simple tool for automating mouse clicks. 项目地址: https://gitcode.com/gh_mirrors/au/AutoClicker AutoClicker是一款专业的Windows桌…...