【MySql】C语言连接mysql|图形化工具

文章目录

  • Connector/C 使用
  • mysql接口介绍
  • Navicat远程连接数据库

Connector/C 使用

说完了mysql的基础,后面我们只关心使用,要使用C语言连接mysql,需要使用mysql官网提供的库,前往官网下载即可。

image-20230625185446125

但是实际上我们并不需要这样去做,我们之前用yum安装mysql的时候就已经包含了,我们前往lib64/mysql/下查看即可:直接用就行了

image-20230625192007704

现在,我们直接来对相关的API进行调用即可。

我们来通过 mysql_get_client_info() 函数,来验证我们的引入是否成功

#include <iostream>
#include <mysql/mysql.h>int main()
{std::cout<<"mysql cilent version: "<<mysql_get_client_info()<<std::endl;return 0;
}

进行编译:记得带上-L库的位置与-l库的名称

image-20230625194115886

测试运行:运行成功,结果如下

image-20230625194148650

mysql接口介绍

我们可以先看一看官方文档:

image-20230625195447739

image-20230625195549329

  • 初始化mysql_init()

要使用库,必须先进行初始化!

MYSQL *mysql_init(MYSQL *mysql);  
  • 关闭mysql链接mysql_close
void mysql_close(MYSQL *sock);

初始化与关闭是最基础的操作:

#include <iostream>
#include <mysql/mysql.h>
int main()
{MYSQL* my = mysql_init(nullptr);if(nullptr == my){std::cerr<<"init MySQL error"<<std::endl;return 1;}mysql_close(my);return 0;
}
  • 链接数据库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函数中各参数,基本都是顾名思意

  • 下发mysql命令mysql_query
int mysql_query(MYSQL *mysql, const char *q);

第一个参数上面已经介绍过,第二个参数为要执行的sql语句,如“select * from table”

举个例子,直接更新数据库表中的数据:

#include <iostream>
#include <mysql/mysql.h>
#include <string>
#include <unistd.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()
{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(),passwd.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="update user set name='Jimmy' where id=2";int n = mysql_query(my,sql.c_str());if(n==0) std::cout<<sql<<"success"<<std::endl;else std::cout<<sql<<"failed"<<std::endl;mysql_free_result(res);mysql_close(my);return 0;
}

结果如下,更新成功

image-20230626204951000

  • 获取执行结果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_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api基本就是读取
MYSQL_RES 中的数据

  • 获取结果行数mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *res);
  • 获取结果列数mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
  • 获取列名mysql_fetch_fields
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
  • 获取结果内容mysql_fetch_row
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.当成一个二维数组来用吧

举个例子:

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()
{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(),passwd.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 = "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(res==nullptr){std::cerr<<"mysql_store_result_error"<<std::endl;}int 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);for(int j = 0;j<fields;j++){std::cout<<row[j]<<"\t";}std::cout<<"\n";}std::cout<<fields_array[0].db<<" "<<fields_array[0].table<<std::endl;mysql_free_result(res);mysql_close(my);return 0;
}

结果如下:

image-20230627213240361

Navicat远程连接数据库

图形化管理mysql的工具有挺多,这里使用的是Navicat,下面进行连接的演示,

  • 准备工作

首先,在服务器端创建mysql用于远程连接的账户worjkbench:

create user 'workbench'@'%' identified by '123456';

同时,创建完毕之后,我们把数据库conn的权限下放给这个账户:

grant all on conn.* to 'workbench'@'%';
flush privileges;

查看创建的信息:

image-20230628123045572

在这个账户下就可以看到这个数据库了:

image-20230628123655147

  • 进行Navicat连接

image-20230628123933367

进行测试连接:连接成功

image-20230628123949830

image-20230628124118942

这就连接成功了。现在我们可以直接来写sql语句:

image-20230628125719192

也可以直接进行图形化进行增删改操作等等:这是图形化带来的好处

image-20230628125758732

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣1768.交替合并字符串(java模拟法)

题目描述&#xff1a; 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 问题分析&#xff1a; 我们可以直…

MySQL MHA高可用集群部署及故障切换

MySQL MHA高可用集群部署及故障切换 一、MHA概述二、MHA的组成三、MHA的特点四、MHA的原理五、搭建MySQLMHA1、所有服务器&#xff0c;关闭系统防火墙和安全机制2、修改 master&#xff08;192.168.92.11&#xff09;、Slave1&#xff08;192.168.92.12&#xff09;、Slave2&am…

Jmeter(jmeter-plugins插件的安装使用)

目录 一、安装JMter Plugins 二、Custom Thread Groups插件 Stepping Thread Group 元件 Ultimate Thread Group 一、安装JMter Plugins 1、官网下载 JMeter Plugins 的jar包 2. 将下载的jar包复制到 %JMETER_HOME%\lib\ext 目录下 3. 启动 JMeter --> Options -->…

[BJDCTF2020]认真你就输了

题目具有极大的威胁性 打开下发的excel文件&#xff0c;发现报错&#xff0c;文件格式与扩展不匹配&#xff0c;说明文件后缀做了更改 拿去010&#xff0c;根据文件头发现是一个zip压缩文件 成功解压&#xff0c;结果解压出来的文件一个都看不懂&#xff0c;查看了wp得知 刚上来…

Framework - AMS

一、概念 Android10&#xff08;API29&#xff09;开始&#xff0c;ActivityTaskManagerService 接管 ActivityManagerService。 二、启动ATMS过程 三、启动APP & 跳转Activity过程 3.1 Activity → ATMS 启动一个 APP 或跳转一个 Activity 都是调用的 startActivity()&a…

【MySQL】SQL的高阶用法

文章目录 条件查询使用关系运算符查询使用IN关键字查询使用BETWEEN AND关键字查询使用空值查询使用AND关键字查询使用OR关键字查询使用LIKE关键字查询(模糊查询)使用LIMIT分页查询使用GROUP BY进行分组查询GROUP BY和聚合函数一起使用GROUP BY和聚合函数以及HAVING一起使用 使用…

Spring Boot 操作 Redis 的各种实现

一、Jedis,Redisson,Lettuce三者的区别 共同点&#xff1a;都提供了基于Redis操作的Java API&#xff0c;只是封装程度&#xff0c;具体实现稍有不同。 不同点&#xff1a; 1.1、Jedis 是Redis的Java实现的客户端。支持基本的数据类型如&#xff1a;String、Hash、List、Se…

Kubernetes·陈述式声明式资源管理

陈述式资源管理方法&#xff1a; 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 2.kubectl 是官方的CLI命令行工具&#xff0c;用于与 apiserver 进行通信&#xff0c;将用户在命令行输入的命令&#xff0c;组织并转化为 apiserver 能识别的信…

微机实验一:认识实验系统和联机通讯实验

实验目的 讲清楚进行本实验后要学到的知识、掌握的数据结构及共定义和农示方法&#xff0c;讲清楚所采用的算法 wrTPL-486微机原理及接口技术数学实验手统的操u)孰秀TPC-480联机集闯开发调试故件的操作环境3)3俩文丝计体机的基阻成和4、存储器并有接新i的置(了解岗单汇海语谢设…

Spring boot日志配置

前言 Spring Boot 底层默认使用 slf4j 和 logback 的方式记录日志。工程中依赖了 spring-boot-starter-web&#xff0c;它又依赖了 spring-boot-starter-logging&#xff0c;所以不需要再手动添加该依赖。在 Spring Boot 中&#xff0c;application.yml 支持部分 logback 的日…

电路的组成和连接方式-通路、开路、短路

电路是电子设备中最基本的组成部分之一&#xff0c;它由各种电子元件组成&#xff0c;并通过连接方式构建成不同的电路结构。在电路设计和维护中&#xff0c;通路、开路和短路是常见的概念&#xff0c;它们分别代表了电路中不同的连接状态和故障情况。 工具认识&#xff1a; …

CVPR2023中的数据集工作(共46篇)

本文搜集了CVPR2023中所有的以数据集发布为主的工作&#xff0c;共搜集到46篇。所有标题都附带文章超链接&#xff0c;请君享用&#xff5e; An Image Quality Assessment Dataset for PortraitsLOGO: A Long-Form Video Dataset for Group Action Quality AssessmentTowards …