C语言访问Mysql
文章目录
- C语言访问Mysql
- 1. 环境设置
- 2. mysql接口介绍
- (1) 初始化mysql_init()
- (2) 链接数据库mysql_real_connect
- (3) 下发mysql命令mysql_query()
- (4) 获取执行结果mysql_store_result
- (5) 释放结果集mysql_free_result()
- (6) 获取结果行数mysql_num_rows
- (7) 获取结果列数mysql_num_fields
- (8) 获取列名mysql_fetch_fields
- (9) 获取结果内容mysql_fetch_row
- (10) 关闭mysql链接mysql_close
- 3. 测试代码
C语言访问Mysql
1. 环境设置
环境设置这里我就简单介绍一下,参考我mysql环境安装的博客:MySQL环境安装_Ryujianli的博客-CSDN博客
如果你像我一样在linux下安装了mysql,就能在对应的目录下找到库和头文件
ls /lib64/mysql
ls /usr/include/mysql
如果你找不到,可以再安装一下
yum install mysql-devel
配置好环境后,直接打开vscode开始测试,要#include<mysql/mysql.h>
引入mysql的头文件
注意makefile文件的写法:
mytest:test.ccg++ -o mytest test.cc -L/lib64/mysql -lmysqlclient -std=c++11
.PHONY:clean
clean:rm -f mytest
测试代码:
#include<iostream>
#include<mysql/mysql.h>int main()
{std::cout<<"mysql client version: "<<mysql_get_client_info()<<std::endl;return 0;
}
如果上面代码能成功运行证明你的库引入成功
2. mysql接口介绍
(1) 初始化mysql_init()
要使用库,必须先进行初始化!
MYSQL * mysql_init(MYSQL *mysql)参数说明: mysql设置为nullptr, 函数分配,初始化,并返回一个新的对象。
返回值: 成功返回一个MYSQL类型的对象, 失败返回nullptr
(2) 链接数据库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);
参数说明:mysql: 你创建并初始化好的MYSQL类型的对象, 即mysql_init的返回值host: 这里使用本地环回地址, 即"127.0.0.1"user: 代表数据库的使用者passwd: userd的密码db: 代表你要连接的数据库名称port: mysql服务的端口号, 默认是3306unix_socket: unix套接字, 设置为nullptr代表这里是网络通信 clientflag: 设置为0
返回值:成功返回连接成功的MYSQL对象, 失败返回nullptr
第一个参数 MYSQL是 C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富有port, dbname, charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。mysql_real_connect函数中各参数,基本都是顾名思意。
建立好链接之后,获取英文没有问题,如果获取中文是乱码:设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8");
(3) 下发mysql命令mysql_query()
int mysql_query(MYSQL *mysql, const char *q);参数说明: 第一个参数上面已经介绍过q: 代表你要执行的sql语句
返回值:成功返回0, 失败返回非0
(4) 获取执行结果mysql_store_result
sql执行完以后,如果是查询语句,我们当然还要读取数据,如果update,insert等语句,那么就看下操作成功与否即可。我们来看看如何获取查询结果: 如果mysql_query返回成功,那么我们就通过mysql_store_result这个函数来读取结果。原型如下:
MYSQL_RES *mysql_store_result(MYSQL *mysql);
MYSQL_RES的介绍:
-
该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果
-
。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果(调用mysql_store_result函数时是把存储的数据转储到MYSQL_RES中)。
-
同时该函数malloc了一片内存空间来存储查询过来的数据,所以一定要使用mysql_free_result() 函数来释放,否则会造成内存泄漏。
-
执行完mysql_store_result以后,其实数据都已经在MYSQL_RES变量中了。
MYSQL_RES叫做结果集,我们可以把想象成一个char**类型的,每一小块空间里存储的是一条记录中的某一个数据所以要用一个char *类型的指针去指向这一个数据,一行的数据就构成一条记录,一共有多少条记录就有多少行,每一行都会有一个二维指针去指向这一行
(5) 释放结果集mysql_free_result()
void mysql_free_result(MYSQL_RES *result)
(6) 获取结果行数mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *res);
(7) 获取结果列数mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
(8) 获取列名mysql_fetch_fields
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
(9) 获取结果内容mysql_fetch_row
MYSQL_ROW其实是char **,可以当成一个二维数组来用
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
(10) 关闭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);
3. 测试代码
前提:makefile文件的写法我在环境设置部分已经说明,在使用此代码测试前要为自己创建一个mysql下的普通账号并赋予其对特定数据库的所有权限,在我上一个博客中:
MySQL用户管理_Ryujianli的博客-CSDN博客
#include<iostream>
#include<mysql/mysql.h>
#include<string>const std::string host="127.0.0.1";
const std::string user="user_l";
const std::string password="1003898";
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(nullptr ==my){std::cerr<< "init MySQL error" <<std::endl;return 1;}if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0)==nullptr){std::cerr<<"connect MySQL error"<<std::endl;return 2;}mysql_set_character_set(my,"utf8");// 增删改简单处理// std::string sql="insert into user (name,age,telephone) values ('张三', 19, '1523467')";// std::string sql="insert into user (name,age,telephone) values ('kitty', 29, '13234567')";// std::string sql="update user set name='Jimmy' where id=2";// std::string sql="delete from user where id=3";// 查的处理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::cout<<sql<< " failed " <<std::endl;return 3;}MYSQL_RES*res=mysql_store_result(my);if(nullptr==res){std::cerr<< "mysql_store_result error" <<std::endl;return 3;}// 全部都是和结果集有关的, resint rows=mysql_num_rows(res);int 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); // char**for(int j=0;j<fields;++j){std::cout<<row[j]<< "\t"; // *(row+j)}std::cout<< "\n";} std::cout<<fields_array[0].db<<" "<<fields_array[0].table<<std::endl;// std::cout<<"connect success"<<std::endl;mysql_free_result(res);mysql_close(my);return 0;
}
相关文章:

C语言访问Mysql
文章目录 C语言访问Mysql1. 环境设置2. mysql接口介绍(1) 初始化mysql_init()(2) 链接数据库mysql_real_connect(3) 下发mysql命令mysql_query()(4) 获取执行结果mysql_store_result(5) 释放结果集mysql_free_result()(6) 获取结果行数mysql_num_rows(7) 获取结果列数mysql_num…...

软件设计师(十)网络与信息安全基础知识
计算机网络是由多台计算机组成的系统,与传统的单机系统、多机系统相比有很大的区别。 一、网络概述 计算机网络是计算机技术与通信技术相结合的产物,它实现了远程通信、远程信息处理和资源共享。 1、计算机网络的概念 计算机网络的定义是利用通信设备…...
蓝桥杯官网填空题(换零钞)
题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 X 星球的钞票的面额只有:100 元,5 元,2 元,1 元,共 4 种。 小明去 X 星旅游,他手里只有 2 张…...

JavaFX之Stage
Stage(舞台),它代表了一个顶级窗口,是JavaFX应用程序的主要容器。Stage可以包含多个场景(Scene),每个场景可以包含各种用户界面元素(如按钮、文本框等)。Stage提供了许多…...

深度翻页导出导致慢SQL,mysqlCPU飙升优化方案
慢SQL原因分析: 1.深度翻页 2.多表JOIN 3. 大IN 4. id倒排序 本文针对深度翻页的优化进行探讨 方案1: 将limit offset, pageSize的方式改成 id > xx limit pageSize. 这样能走Id索引,提高速度。 缺点:不能使用多线程…...

小谈设计模式(1)—总序
小谈设计模式(1)—总序 开始操作设计模式总论设计模式是什么组成要素模式名称问题描述解决方案效果描述 设计模式有什么作用提供可重用的解决方案提高代码的可读性和可维护性促进代码的可扩展性提高代码的灵活性和可重用性促进团队合作和沟通作用总结 为…...

【c++】stringstream基础:实现数据类型转换和字符串分割
传统实现整型转换为字符串需要使用itoa或者sprintf,对于itoa和atoi的使用可以看文章: atoi和itoa极简无废话概述 但是用这两个函数进行转换时,所需要的空间事先不确定,所以可能造成程序崩溃,今天介绍的stringstream可…...
Java基础学习笔记-5
前言 Java编程语言是一门广泛应用于软件开发领域的高级编程语言。它的强大特性和跨平台性使其成为许多开发者的首选语言。本文将介绍一些Java编程的关键概念,包括函数重载、可变参数、值传递、递归等,这些概念是Java编程的基础,对于理解和掌…...

合同交付类项目如何高效管理?
美国项目管理协会(PMI)保罗格蕾斯曾说:“当今社会,一切都是项目,一切也将成为项目。”在“万事皆项目”的背景下,企业在运营过程中会产生大量的项目型业务活动,例如:举办市场活动、产品研发、进行企业内训、采购招标、工程建设等等。那么按照…...

两性养生网站源码 生活类减肥网站源码 健康网模板源码 支持QQ登录和百度主动推送
本套模板非常适合生活类,两性类,减肥类等等类型的网站,这类型网站比较好做流量,因为客户群体众多, 可以自行改内容为其他类型网站模板总体非常简洁漂亮,配色合理,视觉舒服,并且配合…...
CentOS7安装Jenkins(更改默认运行的端口号8080->16060)
第一步: 端口号为默认8080 的安装是:Jenkins安装配置 第二步:将默认运行端口8080—>16060 首先修改配置文件 修改配置文件:vi /etc/sysconfig/jenkins修改内容:# 服务监听端口JENKINS_PORT"16060"然后…...

Java开发之Mysql【面试篇 完结版】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、知识体系二、Mysql-优化1. 优化-如何定位慢查询① 问题引入② 解决方案③ 问题总结④ 实战面试 2. 优化-sql执行很慢,如何解决① 问题引入② 解…...
【实战】十二、自动化测试 —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十九)
文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…...

【人月神话】重新探索人月神话:软件工程的现实与挑战
人月神话是一篇由美国软件工程师弗雷德里克布鲁克斯所写的软件工程经典之作,最早发表于1975年。这篇文章的全名是《人月神话:软件工程的神话与现实》(The Mythical Man-Month: Essays on Software Engineering),它涵盖…...

电阻和电容
目录 1、常见的电阻器 2、电容 编辑 1、常见的电阻器 对于电阻需要了解三个参数(查询电阻的数据手册): 1、封装:就是电阻的尺寸或者大小,看焊在你的pcb板上是否合适。 2、标称:电阻的电阻大小、精度、…...
01-Java-日志框架
1 日志技术概述 1.1 什么是日志技术 日志技术是一种记录和存储应用程序运行时信息的技术。它可以捕获应用程序的状态、事件、错误和警告等信息,并将其保存到日志文件或其他存储介质中。日志技术可以帮助开发人员和运维团队了解应用程序的运行情况,进…...
【js】map、filter、reduce、fill(待补充...)
const arr [{ id: 1, flag: true },{ id: 2, flag: true },{ id: 3, flag: false },{ id: 4, flag: true }, ]map:返回的是对每个元素进行操作后的结果数组,这个数组的长度和原数组相同 const result arr.map((item: any) > {return item.flag fa…...

【JPC出版】第二届能源与电力系统国际学术会议 (ICEEPS 2023)
第二届能源与电力系统国际学术会议 (ICEEPS 2023) 2023 2nd International Conference on Energy and Electrical Power Systems 第二届能源与电力系统国际学术会议 (ICEEPS 2023)将于2023年10月27日至29日在中国厦门举行。ICEEPS 将汇集能源科学、电气工程和电力系统领域的…...

51单片机的简易篮球计分器倒计时仿真设计( proteus仿真+程序+原理图+报告+讲解视频)
51单片机的简易篮球计分器倒计时仿真设计( proteus仿真程序原理图报告讲解视频) 1.主要功能:2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&&下载链接 51单片机的简易篮球计分器倒计时仿真设计( proteus仿真程序原理图报告讲解视频…...

医院安全不良事件报告系统源码 PHP+ vue2+element+ laravel8+ mysql5.7+ vscode开发
不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”,结合预存上百套已正在使用的模板,帮助医院从对护理事件、药品事件、医疗器械事件、医院感染事件、输血事件、意…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...

C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...