MySQL -- mysql connect

MySQL – mysql connect

文章目录

  • MySQL -- mysql connect
  • 一、Connector/C 使用
    • 1.环境安装
    • 2.尝试链接mysql client
  • 二、MySQL接口
    • 1.初始化
    • 2.链接数据库
    • 3.下发mysql命令
    • 4.获取执行结果
    • 5.关闭mysql链接
    • 6.在C语言中连接MySQL
  • 三、MySQL图形化界面推荐


使用C接口库来进行连接

一、Connector/C 使用

1.环境安装

可以去MySQL官网下载Connector/C,并在服务器上安装;
在这里插入图片描述
安装好之后,可以查看mysql的库文件:
在这里插入图片描述

2.尝试链接mysql client

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

#include <stdio.h>
#include <mysql.h>
int main()
{
printf("mysql client Version: %s\n", mysql_get_client_info());
return 0;
}

makefile:
在这里插入图片描述
由于MySQL是外部库,需要指定编译选项;

运行结果:
在这里插入图片描述

二、MySQL接口

1.初始化

初始化mysql_init()
要使用库,必须先进行初始化!
函数参数:

MYSQL *mysql_init(MYSQL *mysql);

函数使用:

MYSQL *mfp = mysql_init(NULL);

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是 C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。
mysql_real_connect函数中各参数,基本都是顾名思意。

建立好链接之后,获取英文没有问题,如果获取中文是乱码:
设置链接的默认字符集是utf8,原始默认是latinl

mysql_set_character_set(myfd, "utf8");

3.下发mysql命令

下发mysql命令mysql_query
函数参数:

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

第二个参数为要执行的sql语句,如“select * from table”。

4.获取执行结果

获取执行结果mysql_store_result
sql执行完以后,如果是查询语句,我们当然还要读取数据,如果update,insert等语句,那么就看下操作成功与否即可。我们来看看如何获取查询结果: 如果mysql_query返回成功,那么我们就通过mysql_store_result这个函数来读取结果。原型如下:

MYSQL_RES *mysql_store_result(MYSQL *mysql);

该函数会调用MYSQL变量中的t_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);

例如:

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;

获取结果内容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;
}

5.关闭mysql链接

关闭mysql链接mysql_close

void mysql_close(MYSQL *sock);

6.在C语言中连接MySQL

#include <iostream>
#include <cstdlib>
#include <string>
#include <cstdio>
#include <cstring>
#include <mysql/mysql.h>using namespace std;string host = "127.0.0.1"; //'localhost'
string user = "whb";
string passwd = "123456";
string db = "104_105_db";
unsigned int port = 8080;int main()
{// cout << "mysql client version: " << mysql_get_client_info() << endl;// 0. 初始化mysql对象MYSQL *msql = mysql_init(nullptr);if (msql == nullptr){cerr << "mysql_init error" << endl;exit(1);}// 1. 登陆认证if (mysql_real_connect(msql, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){cerr << "mysql_real_connect error" << endl;exit(2);}mysql_set_character_set(msql, "utf8"); // 设置连接编码cout << "mysql_real_connect success" << endl;// string sql = "insert into emp values (666, '张飞', 789.987)";  //编码不一致会导致乱码// string delSql = "delete from emp where id=666";// string updateSql = "update emp set name='赵云' where id=666";// string selectSql = "select * from emp";char sql[1024];while (true){printf("mysql> ");fgets(sql, sizeof sql, stdin); //'    select  * from user   ' // 调用成功的时候,返回值是0, 否则就是1int n = mysql_query(msql, sql);if (strcasestr(sql, "select") && n == 0){cout << "result: " << n << endl;// 对结果进行解析MYSQL_RES *res = mysql_store_result(msql);if (res == nullptr)exit(0);int rows = mysql_num_rows(res);int fields = mysql_num_fields(res);MYSQL_FIELD *fname = mysql_fetch_fields(res);for (int j = 0; j < fields; j++)cout << fname[j].name << "\t|\t";cout << endl;MYSQL_ROW line;for (int i = 0; i < rows; i++){line = mysql_fetch_row(res); // 按行获取文件的内容,自动会更新行数for (int j = 0; j < fields; j++)cout << line[j] << "\t|\t";cout << endl;}printf("%d rows in set\n", rows);}else{cout << "execl sql : " << sql << " done" << endl;}}// 关闭mysql对象mysql_close(msql);return 0;
}

三、MySQL图形化界面推荐

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【SpringBoot】手写模拟SpringBoot核心流程

依赖包 新建一个工程&#xff0c;包含两个 module&#xff1a; springboot 模块&#xff0c;表示 springboot 源码实现&#xff1b;user 模块&#xff0c;表示业务系统&#xff0c;使用 springboot 模块&#xff1b; 依赖包&#xff1a;Spring、SpringMVC、Tomcat 等&#xff…

oracle中分组函数LISTAGG

前言 Oracle中的 GROUP_CONCAT 函数用于将多行数据合并为一行&#xff0c;并以指定的分隔符分隔各个值。在Oracle中&#xff0c;没有直接的GROUP_CONCAT函数&#xff0c;但可以使用 LISTAGG 函数来实现类似的功能。 如何使用 1、使用SELECT语句选择需要合并的列&#xff0c;…

基于springboot实现致远汽车租赁平台管理系统项目【项目源码+论文说明】

基于springboot实现致远汽车租赁平台系统演示 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要…

防火防盗防小人 使用 Jasypt 库来加密配置文件

⚔️ 项目配置信息存放在哪&#xff1f; 在日常开发工作中&#xff0c;我们经常需要使用到各种敏感配置&#xff0c;如数据库密码、各厂商的 SecretId、SecretKey 等敏感信息。 通常情况下&#xff0c;我们会将这些敏感信息明文放到配置文件中&#xff0c;或者放到配置中心中。…

pytorch DistributedDataParallel 分布式训练踩坑记录

目录 一、几个比较常见的概念&#xff1a;二、踩坑记录2.1 dist.init_process_group初始化2.2 spawn启动&#xff08;rank怎么来的&#xff09;2.3 loss backward2.4 model cuda设置2.5 数据加载 一、几个比较常见的概念&#xff1a; rank: 多机多卡时代表某一台机器&#xff…

浅谈Elasticsearch监控和日志分析

Elasticsearch 监控和日志分析 Elasticsearch 是一个分布式搜索引擎&#xff0c;它提供了全文搜索、结构化搜索、分析等功能。在实际应用中&#xff0c;监控和日志分析是确保 Elasticsearch 集群稳定、高效运行的关键。本文将详细讲解 Elasticsearch 的监控和日志分析功能&…

rabbitmq 交换机相关实例代码

1.扇形交换机 定义扇形交换机和队列 package com.macro.mall.portal.config;import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.FanoutExchange; import org.springframework.amqp.…

macOS Sonoma 14.2beta2(23C5041e)发布(附黑白苹果镜像地址)

系统介绍 黑果魏叔11 月 10 日消息&#xff0c;今日向 Mac 电脑用户推送了 macOS 14.2 开发者预览版 Beta 2 更新&#xff08;内部版本号&#xff1a;23C5041e&#xff09;&#xff0c;本次更新距离上次发布隔了 14 天。 macOS Sonoma 14.2 添加了 Music 收藏夹播放列表&…

2000-2022年上市公司数字化转型同群效应数据

2000-2022年上市公司数字化转型同群效应数据 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;股票代码、年份、行业代码、行政区划代码、数字化转型程度-A、数字化转型程度-B、同行业同群-数字化转型程度-A_均值、同行业同群-数字化转型程度-A_中位数、同省份同群-数字化…

专业128分总分390+上岸中山大学884信号与系统电通院考研经验分享

专业课884 信号系统 过年期间开始收集报考信息&#xff0c;找到了好几个上岸学姐和学长&#xff0c;都非常热情&#xff0c;把考研的准备&#xff0c;复习过程中得与失&#xff0c;都一一和我分享&#xff0c;非常感谢。得知这两年专业课难度提高很多&#xff0c;果断参加了学长…

transformers安装避坑

1.4 下载rust编辑器 看到这里你肯定会疑惑了&#xff0c;我们不是要用python的吗&#xff1f; 这个我也不知道&#xff0c;你下了就对了&#xff0c;不然后面的transformers无法安装 因为是windows到官网选择推荐的下载方式https://www.rust-lang.org/tools/install。 执行文…

写一下关于部署项目到服务器的心得(以及遇到的难处)

首先要买个服务器(本人的是以下这个) 这里我买的是宝塔面板的,没有宝塔面板的也可以自行安装 点击登录会去到以下页面 在这个界面依次执行下面命令会看到账号和密码和宝塔面板内外网地址 sudo -s bt 14点击地址就可以跳转宝塔对应的内外网页面 然后使用上述命令提供的账号密…

RK3568平台 查看内存的基本命令

一.free命令 free命令显示系统使用和空闲的内存情况&#xff0c;包括物理内存、交互区内存(swap)和内核缓冲区内存。共享内存将被忽略。 Mem 行(第二行)是内存的使用情况。 Swap 行(第三行)是交换空间的使用情况。 total 列显示系统总的可用物理内存和交换空间大小。 used 列显…

SpringBoot中的桥接模式

桥接模式是一种结构型设计模式&#xff0c;它的主要目的是通过将抽象部分与实现部分分离&#xff0c;提高系统的灵活性和可扩展性。在桥接模式中&#xff0c;有四个主要参与者&#xff1a;抽象类、具体抽象类、桥接类和具体类。 抽象类是定义了抽象方法的基类&#xff0c;这些…

内核移植笔记 Cortex-M移植

常用寄存器 PRIMASK寄存器 为1位宽的中断屏蔽寄存器。在置位时&#xff0c;它会阻止不可屏蔽中断&#xff08;NMI&#xff09;和HardFault异常之外的所有异常&#xff08;包括中断&#xff09;。 实际上&#xff0c;它是将当前异常优先级提升为0&#xff0c;这也是可编程异常/…

49.批处理命令(1/2)

目录 一批处理。 &#xff08;1&#xff09;批处理定义。 &#xff08;2&#xff09;常见命令。 &#xff08;2.1&#xff09;rem和:: &#xff08;2.2&#xff09;echo和。 &#xff08;2.3&#xff09;pause。 &#xff08;2.4&#xff09;errorlevel。 &#xff08;…

Halcon WPF 开发学习笔记(2):Halcon导出c#脚本

文章目录 前言HalconC#教学简单说明如何二开机器视觉 前言 我目前搜了一下我了解的机器视觉软件&#xff0c;有如下特点 优点缺点兼容性教学视频(B站前三播放量)OpenCV开源&#xff0c;免费&#xff0c;因为有源码所以适合二次开发学习成本极高&#xff0c;卡学历。研究生博士…

【Java】Netty创建网络服务端客户端(TCP/UDP)

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Netty创建网络服务端客户端示例。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更…

再聊canal的FlatMessage和事务之间的关系

背景 近期得益于项目上的技改推动,我对canal又有了进一步的认识。 最开始我以为flatMassage的id代表的是binlog的唯一id,随着对canal的使用深度不断加深,我逐渐认识到原先认为的是错误的。 你是否有过这样的疑问: 事务与FlatMessage的id是什么关系?不同事务的FlatMessa…

Java线程池——Executor框架

文章目录 一、Executor接口二、ExecutorService接口三、ThreadPoolExecutor类1、状态2、Worker3、扩展 四、ForkJoinPool类1、工作窃取算法2、Fork/Join的设计3、执行原理 五、ScheduledThreadPool类1、ScheduledExecutorService2、比较Timer 六、Executors类 Executor 框架是 …