【MySQL访问】

文章目录

  • 一、C++远程连接到MySQL
    • mysql_init()函数
    • mysql_real_connect()函数
    • 实战案例
  • 二、处理查询select的细节
    • mysql_store_result()函数
    • 获取结果行和列
    • 获取select结果
      • 获取行内容
      • 获取列属性
  • 三、MySQL图形化界面连接


关于动态链接,请看这篇文章:
动静态库

一、C++远程连接到MySQL

前言:这里我在连接时遇到了一个问题,在/usr/include/目录下,找不到mysql目录,意味着我想用的头文件无法找到,上网查了发现问题是没有安装mysql的开发包,所以去安装了mysql的开发包:
sudo yum install mysql-devel;
就解决了这个问题。

mysql_init()函数

MYSQL *mysql_init(MYSQL *mysql);

案例:

MYSQL *msq = mysql_init(nullptr);

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,原始默认是latin1
mysql_set_character_set(myfd, “utf8”);

像这里就出现了乱码问题。
在这里插入图片描述
总结:所有的乱码问题,都是因为客户端和服务器的字符编码没有保持一致。

实战案例

const std::string host = "127.0.0.1";
const std::string user = "dzt";
const std::string passwd = "137183";
const std::string db = "rootDB";
const unsigned int port = 8080;

int main()
{
    // 初始化mysql服务器
    MYSQL *msq = mysql_init(nullptr);
    if (msq == nullptr)
    {
        std::cerr << "init mysql error" << std::endl;
        return 1;
    }
    
    mysql_set_character_set(msq, "utf8"); // 设置默认字符集为utf8,而不是默认的latin1
 
    // 连接到mysql服务器
    if (mysql_real_connect(msq, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cerr << "connect to mysql fail!" << std::endl;
        return 1;
    }
    else
    {
        std::cout << "connect to mysql success!! " << std::endl;
    }

    //让指令能调动mysql
    std::string sql; //不能加const,否则传参时传进getline参数类型不匹配
    while(1)
    {
        std::cout << "mysql> ";
        if(!(std::getline(std::cin,sql)) || sql == "quit")//输入的sql语句为空 || 为quit
        {
            std::cout << "bye" << std::endl;
            break;
        }

        //正式输入sql语句,增删查改
        int n = mysql_query(msq, sql.c_str()); //向msq数据库对象下发指令
        if(n == 0) //成功
        {
            std::cout << "success" << std::endl;
        }
        else
        {
            std::cerr << "fail" << std::endl;
        }   
    }

    mysql_close(msq);
    return 0;
}

二、处理查询select的细节

mysql_store_result()函数

MYSQL_RES *mysql_store_result(MYSQL *mysql);

该函数处理select这类查询语句,再合适不过了。

MYSQL_RES是一个对象,主要用来保存查询的结果。

可以按下面的方式理解:

把MYSQL)RES看成一个char**的数组,每个数组都存储着char*[] 一维数组的地址。
所有查询出来的结果,都看成字符串保存再这些数组中。
在这里插入图片描述

获取结果行和列

获取行数

my_ulonglong mysql_num_rows(MYSQL_RES *res);

获取列数

unsigned int mysql_num_fields(MYSQL_RES *res);

获取select结果

根据上面的二维数组列表图,首先要获取行,才能获取列。
上面已经获取了行数和列数,现在则只需要依次获取每一行的内容即可。(即获取每一行的数组)

获取行内容

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

案例:

int rows =  mysql_num_rows(res); //获取行数
int fields = mysql_num_fields(res); //获取列数

std::cout << "行:" << rows << " 列:" << fields << std::endl;

for(int i = 0;i < rows;i++)
{
    //打印一行的内容
    MYSQL_ROW row = mysql_fetch_row(res); //获取res对象中的结果
    for(int j = 0;j < fields;j++)
    {
        std::cout << row[j] <<" ";
    }
    std::cout << std::endl;
}

在这里插入图片描述

获取列属性

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
//获取列属性数组,这个列属性是一个结构体对象,有许多成员
//数组每个成员都是一个对象
MYSQL_FIELD* fields_array = mysql_fetch_fields(res);
for(int i = 0;i < fields;i++)
{
    std::cout << fields_array[i].name << " ";
}
std::cout << std::endl;

在这里插入图片描述

列属性和行内容联动,就获取到了完整的属性名+数据了。

三、MySQL图形化界面连接

推荐使用 navicat 和SQLyog。
具体连接方式请查阅其他文章。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】基于C语言实现的贪吃蛇游戏

【C语言】基于C语言实现的贪吃蛇游戏 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C语言学习之路 文章目录 【C语言】基于C语言实现的贪吃蛇游戏前言一.最终实现效果一.Win32 API介绍1.1Win32 API1.2控制台程序1.3控制台屏幕上的坐标COORD…

类和对象(中)【类的6个默认成员函数】 【零散知识点】 (万字)

类和对象&#xff08;中&#xff09; 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1…

TiDB-从0到1-体系结构

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCC 一、TiDB体系结构图 TiDB基础的体系架构中有4大组件 TiDB Server&#xff1a;用于处理客户端的请求PD&#xff1a;体系的大脑&#xff0c;存储元数据信息TiKV&#xff1a…

kvm--安装启动

前期 使用vmware workstation 时 安装kvm yum install qemu-kvm qemu-kvm-tools libvirt libvirt-client virt-manager virt-install -y systemctl enable --now libvirtd

【数据结构】二叉树运用及相关例题

文章目录 前言查第K层的节点个数判断该二叉树是否为完全二叉树例题一 - Leetcode - 226反转二叉树例题一 - Leetcode - 110平衡二叉树 前言 在笔者的前几篇篇博客中介绍了二叉树的基本概念及基本实现方法&#xff0c;有兴趣的朋友自己移步看看。 这篇文章主要介绍一下二叉树的…

使用cad绘制一个螺旋输送机

1、第一步&#xff0c;绘制一个矩形 2、使用绘图中的样条线拟合曲线&#xff0c;绘制螺旋线。 绘制时使用上下辅助线、阵列工具绘制多个竖线保证样条线顶点在同一高度。 3、调整矩形右侧的两个顶点&#xff0c;使其变形。 矩形1和矩形2连接时&#xff0c;使用blend命令&#…

Nginx(openresty) 开启目录浏览 以及进行美化配置

1 nginx 安装 可以参考:Nginx(openresty) 通过lua结合Web前端 实现图片&#xff0c;文件&#xff0c;视频等静态资源 访问权限验证&#xff0c;进行鉴权 &#xff0c;提高安全性-CSDN博客 2 开启目录浏览 location /file{alias /data/www/; #指定目录所在路径autoindex on; …

2024-简单点-opencv图像处理实时可视化桌面程序

需求&#xff1a; 图片预处理的时候 想用常用的图像处理函数处理看看效果&#xff0c;但是每次都要写可视化程序&#xff0c;很麻烦。 于是自己写了一个可视化程序&#xff0c;可以调整滑块然后实时可视化 加功能也很好加&#xff0c;只要写个处理函数就可以 界面如此&#…

Window系统安装Docker

因为docker只适合在liunx系统上运行&#xff0c;如果在window上安装的话&#xff0c;就需要开启window的虚拟化&#xff0c;打开控制面板&#xff0c;点击程序&#xff0c;在程序和功能中可以看到启动和关闭window功能&#xff0c;点开后&#xff0c;找到Hyper-V&#xff0c;Wi…

AI 加持下的 DevOps 革新:提升软件开发和运维效率的未来策略

在数字化转型的浪潮中,DevOps 已成为提升软件开发和运维效率的关键策略。而随着人工智能(AI)技术的飞速发展,DevOps 正迎来全新的革新机遇。本文将深入探讨 AI 如何赋能 DevOps,优化软件开发流程,增强运维自动化水平,从而加速企业的数字化转型进程。我们将分析 AI 在需求管理、…

基础—SQL—DQL(数据查询语言)案例练习

一、需求 0、emp 表的初始数据 1、查询年龄为20,21,22,23岁的员工信息。 SELECT * FROM emp WHERE gender女AND age IN(20,21,22,23); 2、查询性别为男&#xff0c;并且年龄在20-40岁(含)以内的姓名为三个字的员工。 SELECT * FROM emp WHERE gender男 AND age BETWEEN 20 AND …

STL:copy简介

STL:copy STL算法&#xff1a;copy std::copy()函数使用 std::copy 函数在 中声明&#xff0c;属于变易算法(Modifying sequence operations)&#xff0c;主要用于实现序列数据的复制 template <class InputIterator, class OutputIterator>OutputIterator copy (InputI…

2024年度CCF-阿里云瑶池科研基金正式发布

2024年度CCF-阿里云瑶池科研基金正式发布 截止时间&#xff1a;2024年7月1日24:00&#xff08;北京时间&#xff09; 欢迎CCF会员积极申报 “CCF-阿里云瑶池科研基金”由CCF与阿里云计算有限公司于2024年联合设立&#xff0c;专注于数据库领域&#xff0c;旨在为领域学者提供…

KT6368A双模蓝牙芯片上电到正常发送AT指令或指令复位需要多久

一、简介 KT6368A芯片上电到正常发送AT指令&#xff0c;或者开启蓝牙广播被搜索到&#xff0c;或者指令复位需要多久等等系列问题总结 详细描述 其实这些问题归结到一起&#xff0c;就还是一个问题&#xff0c;芯片上电需要多久的时间 在另外一份文档里面&#xff0c;是有描…

闽盾杯 2021 DNS协议分析

今年CISCN的Tough DNS 的前戏就是DNS协议分析 直接可以查找到flag的base64形式Zmxh 发现就是请求的dnslog 携带的数据 过滤器就是 dns tshark -r dns.pcapng -T json -Y "dns" >1.json 字段选择 dns.qry.name tshark -r dns.pcapng -T json -Y "dns"…

鸿蒙开发接口媒体:【@ohos.multimedia.medialibrary (媒体库管理)】

媒体库管理 说明&#xff1a; 该组件从API Version 6开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 导入模块 …

改进YOLOv8系列:构建新型单头transformer模块,加入到骨干尾部

改进YOLOv8系列:构建新型单头transformer模块,加入到骨干尾部 需要修改的代码self attention代码创建yaml文件测试是否创建成功本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代码和包含多种更有效加入YOLOv8中的yaml结构,读者…

as keyof GlobalStore

解释 as keyof GlobalStore 在 TypeScript 中&#xff0c;as keyof GlobalStore 是一种类型断言语法。它告诉 TypeScript&#xff0c;返回的值是一个特定类型的值&#xff0c;这里是 GlobalStore 类型的键。这在编译时有助于确保类型安全。 关键点&#xff1a; 类型断言&…

JVM哪些区域可能出现内存溢出,哪些地方需要GC?

GC顾名思义也就是垃圾回收&#xff0c;有人的地方就有江湖&#xff0c;那有数据的地方也理应有垃圾回收&#xff0c;所以思考一下&#xff0c;沿着之前提到过的JVM内存分区&#xff0c;堆&#xff0c;栈&#xff0c;程序计数器&#xff0c;方法区 堆、栈、方法区…