MySQL-MySQL访问

文章目录

  • 前言
  • 一、使用步骤
    • 1.MYSQL *mysql_init(MYSQL *mysql);
    • 2.MYSQL *mysql_real_connect
    • int mysql_query(MYSQL *mysql, const char *q);
    • MYSQL_RES *mysql_store_result(MYSQL *mysql);
      • my_ulonglong mysql_num_rows(MYSQL_RES *res);
      • unsigned int mysql_num_fields(MYSQL_RES *res);
      • MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
      • MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
    • 所有源代码


前言

通过之前的章节,我们已经学会了MySQL的大部分基本操作和概念,今天我们将要学习通过C语言接口来访问MySQL。

需要注意的是,今天我们要使用的接口都来自于第三方库,这个库是由MySQL提供的,我们需要用到 mysql.h 和 mysqlclient.so ,头文件一般在/usr/include/mysql/,动态库文件有的在/usr/lib/或者/usr/lib64/中,不过我的就在/usr/lib/x86_64-linux-gnu/目录下,所以如果你找不到的话,可以直接使用sudo find / -name libmysqlclient.so来直接查找。

当然前提是你的主机安装了mysql,一般会自动给你添加这些库文件。

g++ -o test test.cc -std=c++11 -lmysqlclient -L /usr/lib/x86_64-linux-gnu/

一、使用步骤

1.MYSQL *mysql_init(MYSQL *mysql);

就像是我们之前的要使用Windos下的网络通信一样,需要先初始化环境,这个接口函数就是初始化当前的环境。

MYSQL *mysql_ptr = mysql_init(nullptr);

后续我们要进行对mysql进行连接就需要用上该返回值MYSQL*

2.MYSQL *mysql_real_connect

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的返回值,
参数const char *user,
const char *passwd,
const char *db,
unsigned int port 很显而易见。

至于最后两个参数我们这里暂时不作考虑。

如果连接失败,则会返回nullptr。


#include <iostream>
#include <mysql/mysql.h>
#include <string>const std::string host = "127.0.0.1";
const std::string user = "fengjunzi";
const std::string passwd = "wdnmdsb1";
const std::string database = "test_db";
const unsigned int port = 3306;
int main()
{MYSQL *mysql_ptr = mysql_init(nullptr);if (mysql_ptr == nullptr){std::cerr << "MySQL Init Error" << std::endl;mysql_close(mysql_ptr);exit(1);}if (mysql_real_connect(mysql_ptr, host.c_str(), user.c_str(), passwd.c_str(), database.c_str(), port, nullptr, 0) == nullptr){std::cerr << "MySQL Connect Error" << std::endl;mysql_close(mysql_ptr);exit(2);}std::cout << "MySQL Connect Success" << std::endl;
}

int mysql_query(MYSQL *mysql, const char *q);

这个函数就是用来对连接的mysql下达指令的函数,参数const char *q就是你下达的指令的字符串。

    //模拟mysql输入命令行while (true){std::cout << "mysql> ";if (!std::getline(std::cin, mysql_statement) || mysql_statement == "quit" || mysql_statement == "quit;"){std::cout << "bye bye" << std::endl;break;}int n = mysql_query(mysql_ptr, mysql_statement.c_str());if (n == 0){std::cout << "MySQL Query Success" << std::endl;}else{std::cerr << "MySQL Query Error" << std::endl;break;}

通过mysql_query我们确实可以给mysql下达指令,但是,我们如果调用select,其实是没有反应的,那么如果我们要读取内容显示出来,应该怎么办呢?

如何做到获取select结果?
在这里插入图片描述

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 中的数据。

my_ulonglong mysql_num_rows(MYSQL_RES *res);

获取结果行数mysql_num_rows

unsigned int mysql_num_fields(MYSQL_RES *res);

获取结果列数mysql_num_fields

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

获取列名mysql_fetch_fields

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

用于获取行内容数据,返回的MYSQL_ROW其实是一个char**。

        if (mysql_statement.substr(0,6) == "select"){MYSQL_RES *result = mysql_store_result(mysql_ptr);MYSQL_FIELD *field_array = mysql_fetch_fields(result); // 获取列名unsigned int fields = mysql_num_fields(result);        // 获取列数unsigned int rows = mysql_num_rows(result);            // 获取行数for (int i = 0; i < fields; i++){std::cout << field_array[i].name << "\t";}std::cout << std::endl;for (int i = 0; i < rows; i++){MYSQL_ROW line = mysql_fetch_row(result); // typedef MYSQL_ROW char**for (int j = 0; j < fields; j++){std::cout << line[j] << "\t";}std::cout << std::endl;}free(result);  //记得free,不然会造成内存泄漏!}

在这里插入图片描述

所有源代码

#include <iostream>
#include <mysql/mysql.h>
#include <string>const std::string host = "127.0.0.1";
const std::string user = "fengjunzi";
const std::string passwd = "wdnmdsb1";
const std::string database = "test_db";
const unsigned int port = 3306;
int main()
{// std::cout << "mysql version: " << mysql_get_client_info() << std::endl;MYSQL *mysql_ptr = mysql_init(nullptr);if (mysql_ptr == nullptr){std::cerr << "MySQL Init Error" << std::endl;mysql_close(mysql_ptr);exit(1);}if (mysql_real_connect(mysql_ptr, host.c_str(), user.c_str(), passwd.c_str(), database.c_str(), port, nullptr, 0) == nullptr){std::cerr << "MySQL Connect Error" << std::endl;mysql_close(mysql_ptr);exit(2);}std::cout << "MySQL Connect Success" << std::endl;mysql_set_character_set(mysql_ptr, "utf8"); //将我向目标mysql发送的字符编码变为utf8// std::string mysql_statement = "insert into user (name, age) values('李四',13)";//  std::string mysql_statement = "select * from user";std::string mysql_statement;while (true){std::cout << "mysql> ";// mysql_statement = "";if (!std::getline(std::cin, mysql_statement) || mysql_statement == "quit" || mysql_statement == "quit;"){std::cout << "bye bye" << std::endl;break;}int n = mysql_query(mysql_ptr, mysql_statement.c_str());if (n == 0){std::cout << "MySQL Query Success" << std::endl;}else{std::cerr << "MySQL Query Error" << std::endl;break;}if (mysql_statement.substr(0,6) == "select"){MYSQL_RES *result = mysql_store_result(mysql_ptr);MYSQL_FIELD *field_array = mysql_fetch_fields(result); // 获取列名unsigned int fields = mysql_num_fields(result);        // 获取列数unsigned int rows = mysql_num_rows(result);            // 获取行数for (int i = 0; i < fields; i++){std::cout << field_array[i].name << "\t";}std::cout << std::endl;for (int i = 0; i < rows; i++){MYSQL_ROW line = mysql_fetch_row(result); // typedef MYSQL_ROW char**for (int j = 0; j < fields; j++){std::cout << line[j] << "\t";}std::cout << std::endl;}free(result);  //记得free,不然会造成内存泄漏!}}mysql_close(mysql_ptr);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1550758.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何从相机的记忆棒(存储卡)中恢复丢失照片

当您意识到不小心从存储卡中删除了照片&#xff0c;或者错误地格式化了相机的记忆棒时&#xff0c;这些是您会大喊的前两个词。这是一种常见的情况&#xff0c;每个人在他们的一生中都会面临它。幸运的是&#xff0c;有一些方法可以从相机的 RAW 记忆棒&#xff08;存储卡&…

PyGWalker:让你的Pandas数据可视化更简单,快速创建数据可视化网站

1、PyGWalker应用: 在数据分析的过程中,数据的探索和可视化是至关重要的环节,如何高效地将分析结果展示给团队、客户,甚至是公众,是很多数据分析师和开发者面临的挑战,接下来介绍的两大工具组合——PyGWalker与Streamlit,可以帮助用户轻松解决这个问题,即使没有复杂的代…

Tomcat架构解析

Tomcat: 是基于JAVA语言的轻量级应用服务器&#xff0c;是一款完全开源免费的Servlet服务器实现。 1. 总体设计 socket: 其实就是操作系统提供给程序员操作“网络协议栈”的接口&#xff0c;你能通过socket的接口&#xff0c;来控制协议&#xff0c;实现网络通信&#xff0c;达…

JAVA开源项目 新闻推荐系统 计算机毕业设计

本文项目编号 T 056 &#xff0c;文末自助获取源码 \color{red}{T056&#xff0c;文末自助获取源码} T056&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

大数据-153 Apache Druid 案例 从 Kafka 中加载数据并分析

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【HTML5】html5开篇基础(5)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

elementUI表格中某个字段(state)使用计算属性进行转换为对应中文显示

代码案例&#xff1a; <template><el-table:data"tableData"style"width: 100%"><el-table-columnprop"date"label"日期"width"180"/><el-table-columnprop"name"label"姓名"wid…

通信工程师笔记

第一章 1.支撑网是使业务网正常运行,增强网络功能,提供全网服务质量以满足用户要求的网络。 2.常见的有线通信线路包括&#xff08;1&#xff09;双绞线&#xff0c;&#xff08;2&#xff09;同轴电缆&#xff0c;&#xff08;3&#xff09;光纤等&#xff0c;无线通信线路是…

哈希-01-数据分类处理

文章目录 1. 题目描述2. 思路3. 代码 1. 题目描述 信息社会&#xff0c;有海量的数据需要分析处理&#xff0c;比如公安局分析身份证号码、 QQ 用户、手机号码、银行帐号等信息及活动记录。 采集输入大数据和分类规则&#xff0c;通过大数据分类处理程序&#xff0c;将大数据…

【Preference Learning】Reasoning with Language Model is Planning with World Model

arxiv: https://arxiv.org/abs/2305.14992 问题背景&#xff1a;当前LLM推理受到几个关键因素的限制&#xff1a; &#xff08;1&#xff09;LLM缺乏世界模型&#xff08;一种人类就有的对环境的心理表征&#xff0c;可以模拟行动以及活动对外部世界状态的影响&#xff09;去…

TVS/ESD管应用问题点

TVS管全称是Transient Voltage Suppressor&#xff0c; 即瞬态抑制器二极管&#xff0c; 其主要为硅材料&#xff0c; 是 二极管的一种引申工艺器件。 根据其应用的定义&#xff0c; 更多为涉及浪涌等大功率方面的测试&#xff0c; 因 此TVS管主要指SMAJ、 SMBJ及其以上封装&a…

9.29学习

1.线上问题rebalance 因集群架构变动导致的消费组内重平衡&#xff0c;如果kafka集内节点较多&#xff0c;比如数百个&#xff0c;那重平衡可能会耗时导致数分钟到数小时&#xff0c;此时kafka基本处于不可用状态&#xff0c;对kafka的TPS影响极大 产生的原因 ①组成员数量发…

数据库软题1-数据模型+数据库三级模式两级映像

一、数据模型 (一)常见的数据模型 题1-二维表-关系模型 二、三级模式两级映像 (一) 外模式/模式/内模式 <>视图/基本表/文件 题1-三级模式与数据库的三对应 题2-三级模式与数据库的三对应 题3-视图是虚拟表 解析&#xff1a;视图是从一个或几个基本表&#xff08;或视…

ZYNQ中 PL 使用 PS 端晶振实现流水灯

ZYNQ中 PL 使用 PS 端晶振实现流水灯 Create Block Design 点击 Create Block Design, 然后点击 OK: 添加 IP 核 点击 Diagram 中的 号: 在 IP 核的搜索框中输入 ZYNQ, 找到 ZYNQ7 Processing System 的 IP 核,双击之: Viavado 会把 ZYNQ 的 IP 加到我们的 Block Design 中…

企业如何提升知识产权管理效率?

随着企业规模的扩大和创新活动的增加&#xff0c;知识产权管理日益复杂。有效的知识产权管理不仅能够保护企业的创新成果&#xff0c;还能为企业带来巨大的商业价值。然而&#xff0c;许多企业在知识产权管理方面面临着效率低下的问题&#xff0c;管理效率的提升成为企业亟需解…

交换机支持的以太网协议大全

在现代网络架构中,以太网协议是基础设施的核心组成部分,而交换机作为以太网网络的关键设备,其支持的协议种类繁多。理解这些协议的功能和应用场景对于网络管理员和工程师而言至关重要,因为这些协议决定了网络的性能、稳定性和安全性。 以太网协议的发展经历了从最初的10Mb…

使用apipost工具导入通过swag生成的golang接口文档步骤

1.通过swag init 生成docs接口文档 见使用swag init --parseDependency生成api文档报错解决办法 2.导入操作 ok,操作完成

NB_IOT类产品的通信功能生产测试方案

01 物联网行业中存在的问题 在产品的生产流程中&#xff0c;NB 产品的 Socket 通信测试是一个至关重要的环节。Socket 通信作为一种常用的网络通信方式&#xff0c;对于 NB 产品的性能和稳定性有着直接的影响。 在这个阶段&#xff0c;测试人员会精心设计一系列的测试用例&a…

基于OpenCV的实时年龄与性别识别(支持CPU和GPU)

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

NineData云原生智能数据管理平台新功能发布|2024年9月版

本月发布 3 项更新&#xff0c;其中重点发布 3 项。 重点发布 数据复制 - 新增 Oracle 到 Kafka 复制链路 数据复制功能新增支持将 Oracle 中的数据复制到 Kafka&#xff0c;实现数据的实时流转和分发&#xff0c;支持全量和增量。 数据复制 - 新增库表分组复制 创建复制任务…