【MySQL】使用C语言连接数据库
看到标题,可能会疑惑,我们学习的不是C++吗,为什么使用C语言去连接数据库呢??实际上,这两种语言都可以连接数据库,但是C语言提供的API没有进行封装,更有利于我们学习数据库连接。面向API编程,哈哈哈哈哈哈!!!!!
一、安装适合自己平台的mysql connect库
因为我使用的是Ubuntu,所以在这里就只介绍在Ubuntu中如何下载mysql connect库。在Ubuntu下载这个库还是比较简单的,只有几个指令执行就可以了。
更新包信息
sudo apt update安装 MySQL 服务器
sudo apt install mysql-server在Ubuntu中,MySQL的头文件和库文件通常位于以下位置:
- 头文件(如
mysql.h):/usr/include/mysql/- 库文件:
/usr/lib/x86_64-linux-gnu/(或者/usr/lib/,具体路径可能根据系统架构而异)如果你需要这些文件,可以通过安装
libmysqlclient-dev包来获得它们:sudo apt install libmysqlclient-dev这会将头文件和库文件安装到系统的标准位置。
为了检查我们是否已经安装成功,我们可以使用mysql_get_client_info()函数尝试连接mysql client。注意在连接之前,确保自己的服务器是打开状态。
#include <iostream>
#include <string>
#include <mysql/mysql.h>int main()
{std::cout << "mysql client Version: " << mysql_get_client_info() << std::endl;return 0;
}
// Makefile写法
connect : connect.cc g++ -o $@ $^ -lmysqlclient -std=c++11.PHONY:clean
cleam: rm -f connect
二、mysql接口介绍
2.1 mysql_init() 初始化函数
如果想要使用数据库,我们需要先进行初始化!创建出数据库句柄,之后的函数调用需要使用它!!
函数原型:
MYSQL *mysql_init(MYSQL *mysql);
代码示例:
MYSQL *mfp = mysql_init(nullptr); // 大型结构体
if (mfp == nullptr)
{std::cerr << "init mysql error" << std::endl;return -1;
}
2.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结构体的指针,通常使用mysql_init()初始化。*const char host:数据库服务器的主机名或 IP 地址,通常为
"localhost"或者指定的服务器地址。*const char user:用于连接的 MySQL 用户名。
*const char passwd:对应用户的密码。
*const char db:要连接的数据库名。如果不需要选择特定数据库,可以传递
NULL。unsigned int port:数据库服务器的端口号,默认为 3306。如果使用 Unix socket,通常可以设置为 0。
*const char unix_socket:如果使用 Unix socket,可以提供 socket 文件的路径;如果使用 TCP/IP,则可以设置为
NULL。unsigned long client_flag:连接选项的标志位,通常可以设置为 0。
第一个参数MySQL是C API中一个非常重要的变量(mysql_init的返回值),里面的内存非常丰富,有port,dbname,charset等连接基本参数,他也包含了一个叫做st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。
代码示例:
const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string passwd = "Hh.123456";
const std::string db = "test";
const unsigned int port = 3306;if (mysql_real_connect(mfp, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), 3306, nullptr, 0) == nullptr)
{return 2;
}
std::cout << "connect mysql success" << std::endl;
建立好连接之后,获取英文没有问题,如果获取的中文是乱码,我们可以想到的是字符集没有设置正确,设置连接的默认字符集是utf8,原始默认是latinl
mysql_set_character_set(myfd, "utf8");
2.3 mysql_query() 下发mysl命令
函数原型:
int mysql_query(MYSQL *mysql, const char *q);
第一个参数上面已经介绍过了,第二个参数要执行的sql语句,比如“select * from table”。
2.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中会直接提供 void mysql_free_result(MYSQL_RES *result) 来进行释放空间。执行完mysql_store_result函数以后,其实数据都已经子啊MYSQL_RES变量中。
2.5 mysql_num_row() 获取结果行数
my_ulonglong mysql_num_rows(MYSQL_RES *res);
2.6 mysql_num_fields() 获取结果列数
unsigned int mysql_num_fields(MYSQL_RES *res);
2.7 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;
2.8 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;
}
2.9 mysql_close() 关闭mysql链接
void mysql_close(MYSQL *sock);
2.10 mysql_free_result() 释放mysql空间
在 MySQL C API 中,mysql_free_result() 函数用于释放与 MYSQL_RES 结构体相关的内存。当你完成对查询结果的处理后,调用此函数可以避免内存泄漏。
函数原型:
void mysql_free_result(MYSQL_RES *result);
参数:
- result:指向要释放的
MYSQL_RES结构体的指针。
使用示例:
MYSQL_RES *result = mysql_store_result(conn); // 处理结果...
mysql_free_result(result); // 释放内存
在每次使用 mysql_store_result() 或类似函数后,都应该调用 mysql_free_result() 来清理资源。
相关文章:
【MySQL】使用C语言连接数据库
看到标题,可能会疑惑,我们学习的不是C吗,为什么使用C语言去连接数据库呢??实际上,这两种语言都可以连接数据库,但是C语言提供的API没有进行封装,更有利于我们学习数据库连接。面向API编程,哈哈…...
Vue学习记录之四(watch侦听器和watchEffect高级侦听器)
watch watch 用于侦听特定的响应式数据源(如数据、计算属性等),比如ref或者是reactive时,并在其变化时执行回调函数。它适合用于处理副作用,如 API 请求或异步操作。使用 watch 适合特定数据变化的侦听,提…...
RedisTemplate操作ZSet的API
文章目录 ⛄概述⛄常见命令有⛄RedisTemplate API❄️❄️ 向集合中插入元素,并设置分数❄️❄️向集合中插入多个元素,并设置分数❄️❄️按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部❄️❄️获得指定元素的分数❄️❄️返回集合内的成员个数❄️❄…...
Android 15 正式发布至 AOSP
Google官方宣布,将于近期发布了 Android 15,而在早些时候,Google已经将其源代码推送至 Android 开源项目 (AOSP)。未来几周内,Android 15 将在受支持的 Pixel 设备上正式推出,并将于今年晚些时候在三星、Honor、iQOO、…...
IEEE Electronic Library(IEL)数据库文献检索下载介绍及个人获取IEEE文献途径
一、数据库介绍 IEEE(The Institute of Electrical and Electronics Engineers,电气电子工程师学会)是目前全球最大的非营利性专业技术学会,在全球160多个国家拥有超过45万名会员。IEEE在电气电子、计算机、半导体、通讯、电力能…...
动手学习RAG:大模型重排模型 bge-reranker-v2-gemma微调
动手学习RAG: 向量模型动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习动手学习RAG:rerank模型微调实践 bge-reranker-v2-m3动手学习RAG:迟交互模型colbert微调实践 bge-m3动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct动手学…...
蓝桥杯2024省C
P10898 [蓝桥杯 2024 省 C] 拼正方形 题目描述 小蓝正在玩拼图游戏,他有 7385137888721个 22的方块和 10470245 个 11 的方块,他需要从中挑出一些来拼出一个正方形,比如用 3 个 22 和 4 个 11 的方块可以拼出一个 44 的正方形,用…...
C++:内部类,匿名对象,操作符new与delete
一.内部类 1.如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。 2.内部类默认是外部类的友元类。…...
【数据结构】排序算法---计数排序
文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaGo 结语 1. 定义 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组…...
mysql时间日期函数、获取当前日期和时间、日期和时间格式化、提取日期部分、日期和时间的算术操作、其他日期函数、日期和时间的比较、日期字符串转换
获取当前日期和时间 NOW():返回当前的日期和时间。CURDATE():返回当前的日期。CURTIME():返回当前的时间。 SELECT NOW(), CURDATE(), CURTIME(); 日期和时间格式化 DATE_FORMAT(date, format):根据指定的格式字符串格式化日期…...
Android开发高频面试题之——kotlin篇
Android开发高频面试题之——kotlin篇 Android开发高频面试题之——Java基础篇 Android开发高频面试题之——Kotlin基础篇 Android开发高频面试题之——Android基础篇 1. Kotlin如何实现空安全的? Kotlin 将变量划分为可空和不可空,通过查看字节码可知,声明不可空的变量会…...
8--SpringBoot原理分析、注解-详解(面试高频提问点)
目录 SpringBootApplication 1.元注解 --->元注解 Target Retention Documented Inherited 2.SpringBootConfiguration Configuration Component Indexed 3.EnableAutoConfiguration(自动配置核心注解) 4.ComponentScan Conditional Co…...
语言的枚举
不同语言的枚举 C/C枚举本质是整型,在Java中是对象,而非基本类型,可通过instanceof Object判断是否是对象类型。C#与Java不同,枚举是值类型。C语言更纯粹,枚举绝对当成整数,可以对枚举变量用整数赋值&…...
C# Redis 框架开发技术详解
引言 Redis 是一个高性能的键值存储系统,广泛用于缓存、消息队列和实时分析等场景。在 C# 中,有几个著名的库和框架可以方便地与 Redis 进行交互。以下是几个常用的 C# Redis 库: StackExchange.Redis: 这是目前最流行、最推荐的 C# Redis 客…...
Rust:Result 和 Error
在 Rust 编程语言中,错误处理是一个核心部分,用于确保程序的健売性和可靠性。Rust 通过 Result 枚举和 Error 特质(trait)来处理错误。 Result 枚举 Result 是一个泛型枚举,用于表示一个操作可能成功或失败。它有两个…...
Python基础(八)——MySql数据库
一.数据库 【库——>表——>数据】 借助数据库对数据进行组织存储,借助SQL语言对数据库、数据进行操作管理 Mysql数据库 下载:https://www.mysql.com/ 查看是否安装配置成功: 安装DBeaver用于Mysql数据库图形化 安装:…...
统一网关--gateway(仅供自己参考)
1、网关的概念: 2、网关的功能: (1):身份认证和权限校验 (2):服务路由(具体的业务路由到具体的服务),负载均衡(多台服务的话ÿ…...
【Leetcode152】分割回文串(回溯 | 递归)
文章目录 一、题目二、思路三、代码 一、题目 二、思路 具体例子和步骤:假设 s "aab",步骤如下: 初始状态: s "aab"path []res [] 第一层递归(外层循环): path []检…...
基于BiGRU+Attention实现风力涡轮机发电量多变量时序预测(PyTorch版)
前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…...
深入探究 Flask 的应用和请求上下文
目标 读完本文后,您应该能够解释: 什么是上下文哪些数据同时存储在应用程序和请求上下文中在 Flask 中处理请求时,处理应用程序和请求上下文所需的步骤如何使用应用程序和请求上下文的代理如何在视图函数中使用current_app和代理request什么…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
