当前位置: 首页 > 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语言链接 的理解,觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~😉
在这里插入图片描述

http://www.lryc.cn/news/522079.html

相关文章:

  • Vue篇-07
  • 使用 LLaMA-Factory 微调大模型
  • 数据仓库的复用性:模型层面通用指标体系、参数化模型、版本化管理
  • Web APP 阶段性综述
  • 某国际大型超市电商销售数据分析和可视化
  • 电子杂志制作平台哪个好
  • Django Admin 实战:实现 ECS 集群批量同步功能
  • 虚拟拨号技术(GOIP|VOIP)【基于IP的语音传输转换给不法分子的境外来电披上一层外衣】: Voice over Internet Protocol
  • 迅为RK3576开发板Android 多屏显示
  • cmake + vscode + mingw 开发环境配置
  • nginx 配置代理,根据 不同的请求头进行转发至不同的代理
  • 类模板的使用方法
  • 高级Python Web开发:FastAPI的前后端集成与API性能优化
  • 期权懂|期权的溢价率和杠杆率有什么区别?
  • 分布式ID的实现方案
  • Py之cv2:cv2(OpenCV,opencv-python)库的简介、安装、使用方法(常见函数、图像基本运算等)
  • 如何学习网络安全?有哪些小窍门?
  • Dart语言的数据结构
  • TabPFN - 表格数据基础模型
  • AOF日志:宕机了Redis如何避免数据丢失?
  • MAC上安装Octave
  • C 语言中二维数组的退化
  • Notion 推出捏脸应用 | Deving Weekly #15
  • C# Linq 查询
  • ES7【2016】、ES8【2017】新增特性
  • 64细分步进电机驱动器TMC2209
  • C# 获取PDF文档中的字体信息(字体名、大小、颜色、样式等
  • linux 安装PrometheusAlert配置钉钉告警
  • 【华为路由/交换机的ssh远程设置】
  • 性能测试 - Locust WebSocket client