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开发
不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”,结合预存上百套已正在使用的模板,帮助医院从对护理事件、药品事件、医疗器械事件、医院感染事件、输血事件、意…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 ,你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...