使用 C/C++访问 MySQL
目录
准备工作
尝试链接 MySQL Client
MySQL 接口介绍
准备工作
- 保证 MySQL 服务有效。
- 下载MySQL开发包(可以在MySQL官网下载安装也可以在软件源安装)
MySQL 开发包通常会包含一些特定的头文件和库文件。您可以检查以下常见的路径:
/usr/include/mysql:查找 MySQL 相关的头文件。
/usr/lib或/usr/lib64:查找与 MySQL 相关的库文件,例如libmysqlclient.so。
尝试链接 MySQL Client
通过 mysql_get_client_info() 函数,来验证我们的引入是否成功。
#include <stdio.h>
#include <mysql.h> int main()
{printf("mysql client Version: %s\n", mysql_get_client_info());return 0;
}
编译命令:
user1@hecs-133240:~$ gcc - o test test.c - I./include - L./lib - lmysqlclient
运行时出现错误:
user1@hecs-133240:~$./test
./test: error while loading shared libraries: libmysqlclient.so.18: cannot open shared
object file: No such file or directory
解决方法:设置动态库查找路径
user1@hecs-133240:~$ export LD_LIBRARY_PATH =./lib
这样就成功地将当前目录下的 lib 文件夹添加到了 LD_LIBRARY_PATH 环境变量中,使得系统在运行程序查找动态链接库时,也会在这个指定的目录中进行搜索。
再次运行:
user1@hecs-133240:~$./test
mysql client Version: 6.1.6
至此引入库的工作已经做完,接下来就是熟悉接口。
MySQL 接口介绍
1.初始化 mysql_init():
要使用库,必须先进行初始化!
MYSQL *mysql_init(MYSQL *mysql);
例如:
MYSQL *mfp = mysql_init(NULL);返回值是一个MySQL文件句柄,后续的操作都要用它
2. 链接数据库 mysql_real_connect:
初始化完毕之后,必须先链接数据库,再进行后续操作。(MySQL 网络部分是基于 TCP/IP 的)
//返回nullptr则代表连接失败
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函数中各参数,基本都是顾名思义。
3. 下发 MySQL 命令 mysql_query:
// 返回0表示成功,非0失败
int mysql_query(MYSQL *mysql, const char *q);
第一个参数上面已经介绍过,第二个参数为要执行的 SQL 语句,如“select * from table”。
4. 获取执行结果 mysql_store_result:
SQL 执行完以后,如果是查询语句,我们当然还要读取数据,如果是 update、insert 等语句,那么就看下操作成功与否即可。我们来看看如何获取查询结果:
如果 mysql_query 返回成功,那么我们就通过 mysql_store_result 这个函数来读取结果。原型如下:
MYSQL_RES *mysql_store_result(MYSQL *mysql);
该函数会调用 MYSQL 变量中的 st_mysql_methods 中的 read_rows 函数指针来获取查询的结果。同时该函数会返回 MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数 malloc 了一片内存空间来存储查询过来的数据,
所以我们一定要记得 free(result),不然是肯定会造成内存泄漏的;但较高版本的MySQL直接使用free释放内存会直接出现段错误,我们需要使用专门提供的库函数mysql_free_result(res);
执行完 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);
例如:
int fields = mysql_num_fields(res);
MYSQL_FIELD *field = mysql_fetch_fields(res);
int i = 0;
for(; i < fields; i++){ cout<<field[i].name<<" ";
}
cout<<endl;
- 获取结果内容
mysql_fetch_row:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
它会返回一个 MYSQL_ROW 变量,MYSQL_ROW 其实就是 char **。就当成一个二维数组来用吧。
例如:
i = 0;
MYSQL_ROW line;
for(; i < nums; i++){ line = mysql_fetch_row(res); int j = 0; for(; j < fields; j++){ cout<<line[j]<<" "; } cout<<endl;
}
- 关闭 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);
在 MySQL 的 C API 中,事务操作是确保数据一致性和完整性的重要手段。
- 开启事务:
使用 mysql_autocommit() 函数来关闭自动提交模式,从而开启一个事务。
if (mysql_autocommit(conn, 0)!= 0) {// 处理错误
}
- 执行事务中的操作:
在事务开启后,可以执行一系列的数据库操作,例如插入、更新、删除数据等。
- 提交事务:
使用 mysql_commit() 函数来提交事务,使事务中的操作生效。
if (mysql_commit(conn)!= 0) {// 处理错误
}
- 回滚事务:
如果在事务执行过程中出现错误或需要取消事务的操作,可以使用 mysql_rollback() 函数进行回滚。
if (mysql_rollback(conn)!= 0) {// 处理错误
}
例如,如果在一个银行转账的场景中,从账户 A 向账户 B 转账,需要先从账户 A 扣除相应金额,如果这个操作成功,再向账户 B 增加相应金额。如果在向账户 B 增加金额时出现错误,就需要回滚之前从账户 A 扣除金额的操作,以保证数据的一致性。
在实际使用中,要注意及时处理函数返回的错误码,以确保事务操作的正确执行。
总结:

相关文章:
使用 C/C++访问 MySQL
目录 准备工作 尝试链接 MySQL Client MySQL 接口介绍 准备工作 保证 MySQL 服务有效。下载MySQL开发包(可以在MySQL官网下载安装也可以在软件源安装) MySQL 开发包通常会包含一些特定的头文件和库文件。您可以检查以下常见的路径: /us…...
Linux 网络套接字解析:实现网络通信
目录 一.网络基础1.协议2.OSI与TCP/IP模型3.网络通信流程4.IP与Mac地址 二.网络编程套接字1.端口号2.网络字节序3.tcp、udp协议4.socket编程5.sockaddr结构解析6.实现Udp_socket7.实现Windows与Linux通信8.Linux下远程执行指令9.实现tcp_socket10.守护进程 一.网络基础 1.协议…...
vue3 组合式API
<!-- 深度监听 deep 点击按钮控制台,才输出count变化了: 1, 老值: 0;否则控制台不输出 --> <script setup>import { ref,watch } from vueconst state ref({count:0})const setCount () > {state.count.value}watch(state, () > {console.log(…...
二、什么是Vue中的响应式?Vue的响应式原理
什么是Vue中的响应式 Vue中的响应式,简而言之就是当数据发生变化时,页面跟随变化。使用过Vue的v-model都有比较深刻的感受,我们在代码中修改双向绑定的数据后,页面上的数据也会自动更新,页面跟随变化 我们看个例子&am…...
快9月了才开始强化,跟张宇还是武忠祥?
快9月了才开始强化,跟张宇还是武忠祥! 说真的,我也替这位同学着急,但是考研数学越是进度慢,就越不能急!急着赶进度,容易出事!遇到这个问题的朋友肯定不止一位,那我就帮大…...
SSM好易学学习平台---附源码92142
摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设好易学学习平台。本文…...
对于mp4 ios和mac safari不能播放问题处理
直接对原mp4文件进行重新转码就可以了 ffmpeg -i origin.mp4 -vcodec h264 -profile:v high -level 4.1 orgin_hl.mp4 原因源文件不符合苹果基本规则 苹果官网文档...
开发同城交友找搭子系统app前景分析
开发同城交友系统APP的背景 社交需求多样化: 随着城市化的加速和人们生活节奏的加快,现代人的社交圈子往往较为狭窄,难以结识新朋友。传统的线下交友方式受限于时间、地点等因素,难以满足现代人对于交友的多样化需求。互联网和智…...
faiss向量数据库测试《三体》全集,这家国产AI加速卡,把性能提了7倍!
在人工智能和机器学习技术的飞速发展中,向量数据库在处理高维数据方面扮演着日益重要的角色。近年来,随着大型模型的流行,向量数据库技术也得到了进一步的发展和完善。 向量数据库为大型模型提供了一个高效的数据管理和检索平台,…...
负载均衡---相关概念介绍(一)
负载均衡(Load Balance)是集群技术的一种重要应用,旨在将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,从而提高系统的并发处理能力、增加吞吐量、加强网络处理能力,并提供故障转移以…...
计算机基础知识复习8.14
子线程抛异常主线程能否catch 在不做任何处理的情况下,主线程不能catch 解决方式: 子线程使用try catch来捕获异常 为线程设置未捕获异常处理器UncaughtExceptionHandler 通过future的get方法捕获异常 JVM相关参数 显示指定堆内存-Xms和-Xmx指定最…...
【io深层理解】
io深层理解 1.内核态2.用户态3. select IO多路复用执行原理4. select io多路复用限制和不足 1.内核态 一个进程会涉及多文件的修改,比如说。那么在内核态就会维护一个表,这个表叫文件描述符bitmap,这个表会传递给内核态,当然肯定传…...
【懒人工具】指定新文件,替换全盘旧文件
没辙,就是懒 最近在调整.clang-format,这个format文件要跟着项目走,只换本地默认的还不够。调整好以后一个项目一个项目的换,有时候会漏掉,索性全盘一次性换完。 基于自己操作的流程,写了个脚本࿰…...
React+Vis.js(02):设置节点样式
文章目录 1、修改vis.js的节点和关系颜色2、修改vis.js节点的字体颜色2.1 统一设置节点字体颜色2.2 自定义某个节点的字体颜色3、设置vis.js节点的边框颜色和宽度3.1 设置单个节点3.2 统一设置1、修改vis.js的节点和关系颜色 在vis.js中,可以通过color属性,来给node节点添加…...
3G网络要彻底没了
2月21日,三大运营商公布了最新的用户数据,移动联通电信三家5G套餐用户数合计超过了7.5亿。信通院早前公布的数据显示,一月份,国内市场5G手机出货量2632.4万部,占同期手机出货量的79.7%。 这两项数据,说明我们已经进入到了5G时代,5G的普及速度远超很多人的想象。就在5G逐…...
如何配置ESXI主机的IP地址管理
🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧Linux高级管理防护和群集专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️创作…...
软件测试学习笔记丨测试用例设计方法
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/31921 一,黑盒测试方法论 1,等价类 1.1 定义 等价类划分是一种重要的、常用的黑盒测试方法不需要考虑程序的内部结构,只需要考虑程序的输入规格即可它将…...
MinIO基本用法
在现代云计算和大数据领域,对象存储因其可扩展性、可靠性和低成本成为数据存储的重要选择。MinIO作为一个高性能、分布式的对象存储系统,凭借其开源、简单易用以及与Amazon S3兼容的特性,在业界得到了广泛的应用。本文将带您了解MinIO的基本用…...
MySQL windows版本安装
一、下载MySQL安装包 访问MySQL官网:首先,访问MySQL的官方网站(MySQL),或者更具体地,访问MySQL的下载页面(MySQL :: Download MySQL Community Server)。 选择适合的版本࿱…...
Python实现人脸轮廓提取
目录 一、背景知识1.1 人脸检测和轮廓提取的意义1.2 人脸检测方法概述1.3 轮廓提取方法概述二、常用的人脸轮廓提取方法2.1 基于边缘检测的轮廓提取2.2 基于形态学操作的轮廓提取2.3 基于特征点检测的轮廓提取三、Python实现人脸轮廓提取3.1 安装依赖库3.2 使用Dlib进行人脸检测…...
CLIP-GmP-ViT-L-14图文匹配工具实战:新闻配图与标题语义一致性自动检测
CLIP-GmP-ViT-L-14图文匹配工具实战:新闻配图与标题语义一致性自动检测 你有没有遇到过这种情况?看到一篇新闻,标题写得挺吸引人,但配图却让人摸不着头脑——标题说“科技创新”,配图却是风景照;标题讲“经…...
AsyncSerial:嵌入式非阻塞串口通信实现
1. AsyncSerial 库深度解析:面向嵌入式实时系统的非阻塞串口通信实现 在嵌入式系统开发中,串口(UART/USART)通信因其硬件资源占用少、协议简单、调试便捷等优势,始终是固件层最基础且高频使用的外设接口。然而…...
夜间自动化利器:OpenClaw+nanobot定时执行爬虫任务
夜间自动化利器:OpenClawnanobot定时执行爬虫任务 1. 为什么选择OpenClaw做夜间自动化 凌晨三点,我的电脑屏幕突然亮了起来。这不是灵异事件,而是OpenClaw正在执行我预设的爬虫任务——收集行业数据、清洗整理、存入数据库,整个…...
VoxCPM-1.5-WEBUI场景应用:智能客服、有声读物、教育视频配音
VoxCPM-1.5-WEBUI场景应用:智能客服、有声读物、教育视频配音 1. 开篇:语音合成技术的平民化革命 还记得那些机械感十足的AI语音吗?生硬的语调、奇怪的停顿、模糊的发音,让听众不得不竖起耳朵才能勉强听懂。如今,随着…...
GIL已死,GIL万岁?——2024大厂Python并发岗面试题库首发(含性能压测对比数据)
第一章:GIL已死,GIL万岁?——2024大厂Python并发岗面试题库首发(含性能压测对比数据)一道高频真题:为什么 asyncio.run() 启动的协程无法被 multiprocessing.Process 并发执行? 该问题直指 Pyth…...
MIPI D-PHY v1.2升级指南:如何利用HS-Deskew提升2.5Gbps传输稳定性
MIPI D-PHY v1.2升级指南:如何利用HS-Deskew提升2.5Gbps传输稳定性 在嵌入式系统设计中,高速串行接口的稳定性往往成为项目成败的关键。当MIPI联盟推出D-PHY v1.2规范时,最引人注目的变化莫过于将单通道传输速率从1.5Gbps提升至2.5Gbps——这…...
【AI应用开发】-Agent 思考时间那么长,怎么优化前端的用户体验?
Agent 思考时间那么长,怎么优化前端的用户体验? 文章目录Agent 思考时间那么长,怎么优化前端的用户体验?前言:让等待变成一种享受一、核心策略:透明化 可视化二、实现方案一:Stream 流式输出2.…...
电商数据采集API接口||合规优先、稳定高效、数据精准
一、API 类型选型(先选对,再做对)优先按 “官方 → 第三方聚合 → 自建” 顺序选择,平衡合规、成本与效率:表格API 类型代表平台核心优势适用场景注意事项官方开放 API淘宝 TOP、京东万象、拼多多开放平台、亚马逊 SP-…...
指尖藏趣,抽享惊喜——扭蛋机抽赏盲盒小程序前端功能详解
抽赏盲盒所带来的未知惊喜与收集乐趣,深受不同年龄段用户的喜爱,扭蛋机抽赏盲盒小程序则打破线下场景限制,让这份乐趣随时可及。该小程序前端功能以“简约操作、趣味体验”为核心,聚焦用户可直接操作的功能板块,简化流…...
MySQL局域网远程连接测试教程
MySQL局域网远程连接测试教程1本地服务器安装MySQL服务器,安装MySQL shell, Workbench(非必须)防火墙配置2远程访问用户电脑配置IP配置安装 Workbench客户端1本地服务器 安装MySQL服务器,安装MySQL shell, Workbench(非必须) 点击右下角的Advanced Opt…...
