MySQL学习记录——십사 使用C访问MySQL

news2025/1/19 20:15:58

文章目录

  • 1、准备工作
  • 2、操作
  • 3、select


1、准备工作

root用户的mysql下,创建一个普通用户,创建一个库,通过这个库给普通用户所有权限

create user 'connector'@'localhost' identified by '123456';
create database conn;
grant all on conn.* to 'connector'@'localhost';
flush privileges;
//前提得在root用户下的mysql这个库中
select User,Host from user;

安装C++和C的相关库。有两个办法,更推荐下一个yum源办法,因为第一个办法找不到匹配mysql版本的源。

浏览器输入mysql找到mysql官网

在这里插入图片描述

选择DOWNLOADS,找到这个

在这里插入图片描述

选择最下面的,来到这个页面

在这里插入图片描述

右边那一列最上面两个就是了。这里先下载C的

在这里插入图片描述

中间有个MySQL Connector/C++ 8.0,选择这个。

在这里插入图片描述

显示的是最新版本,archives里是旧版本。根据自己情况选择适合的系统

在这里插入图片描述

下载非debug的。在Linux系统中,在一个目录中,rz空格,找到下载的zip文件,然后传入,传输完成后是这样的,下图的第二个。

在这里插入图片描述

解压出来是一个很长的目录名,可以改一下目录名,目录里是这样

在这里插入图片描述

里面最重要的是include和lib64两个目录。


yum源办法。

mysql5.7版本的数据库,客户端的头文件在 /usr/linclude/mysql中。查看一下安装mysql时的动静态库

ls /lib64/mysql/*

最上方应当有后缀为so,以及a的文件。或者

ls /usr/lib64/mysql/

也和上面一样,so和a后缀的文件。如果没有

yum install mysql-devel

这样就好了。

2、操作

创建一个目录,目录有一个test.cc文件,在这个文件里引用下载好的库。

#include <iostream>
#include <mysql/mysql.h>

int main()
{
    //此函数用来验证引入是否成功
    std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
    return 0;
}

如果编译的话就会报错。因为我们要连接库

g++ -o test test.cc -L/lib64/mysql -lmysqlclient

makefile

test:test.cc
	g++ -o $@ $^ -std=c++11 -L/lib64/mysql -lmysqlclient
.PHONY:clean
clean:
	rm -f test

引入成功就会打印当前mysql的版本。

mysql官网中的文档页,有C API名字的文档,这个就是使用方法。我当前mysql版本要用的就是5.7。

创建一个mysql对象,初始化并关闭。

    MYSQL* my = mysql_init(nullptr);
    if(nullptr == my)
    {
        std::cerr << "init MySQL error" << std::endl;
        return 1;
    }
    mysql_close(my);

使用数据库前要先连接数据库。

在这里插入图片描述

#include <iostream>
#include <mysql/mysql.h>
#include <string>

const std::string host = "localhost";
const std::string user = "connector";
const std::string passwd = "123456";
const std::string db = "conn";
const unsigned int port = 8080;


int main()
{
    //此函数用来验证引入是否成功
    std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;

    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 1;
    }
    mysql_close(my);
    return 0;
}

在conn库里建一个表

create table user( id bigint primary key auto_increment, name varchar(32) not null, age int not null, telphone varchar(32) unique );

下达mysql指令用mysql_query函数,第一个参数是上面创建的mysql对象,第二个是mysql指令。

    std::string sql;
    while(true)
    {
        std::cout << "MySQL>>> ";
        if(!std::getline(std::cin, sql)|| sql == "quit")
        {
            std::cout << "数据库终止" << 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);

在输入时如果写错了字符,按住Ctrl再回退即可。这是模拟一下mysql,实际应用时是这样

    std::string sql = "insert into user (name, age, telphone) values ('peter', 19, '4673842')";
    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;

增删改都可以,但是select是比较难处理的,虽然会成功,但不会显示出来,所以select还得有后续工作才能把内容显示在上层。

插入时如果插入中文,可以成功,但是插入后会成为乱码。这是因为服务端和客户端编码不一致造成的,连接数据库后默认的字符集是latin1,需要设置成utf8。

mysql_set_character_set(my, "utf8");

3、select

select在使用后,结果会保存在我们创建的mysql对象my这个句柄中,用提取函数来拿到结果。

    std::string sql = "select * from user";
    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;
        return 3;
    }
    //把内容转储到res中
    MYSQL_RES* res = mysql_store_result(my);
    if(nullptr == res)
    {
        std::cerr << "mysql_store_result error" << std::endl;
        return 4;
    }

查询出来的数据会被mysql当作字符串,一条记录就是一个字符串,对于每一个字符串,多列的信息都聚合到一个字符串中,有一个数组,数组每一个元素都指向一个字符串的一列的内容,而MYSQL_RES结构体里也有指针去指向这样的每个数组。这样就能理解MYSQL_RES里的成员了。

从MYSQL_RES结构体中拿出内容,也有函数。

    //获取结果行数
    my_ulonglong rows = mysql_num_rows(res);
    //获取结果列数
    my_ulonglong fields = mysql_num_fields(res);
    //获取内容, MYSQL_ROW是char**类型的
    for(int i = 0; i < rows; i++)
    {
        MYSQL_ROW ret = mysql_fetch_row(res);//这个函数类似于迭代器
        for(int j = 0; j < fields; j++)
        {
            std::cout << ret[j] << "\t";//*(ret + j)
        }
        std::cout << "\n";
    }

获取更详细信息

    //获取每一条记录的属性
    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";

上面是把查询到的内容放到了res中,要释放它,也是有函数的

mysql_free_result(res);

释放最一开始创建的mysql对象则是

mysql_close(my);

官方文档中还有很多接口,比如回滚、提交等操作。

结束。

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

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

相关文章

Python中HTTP请求的基本方法:穿越网络的魔法咒语

在网络世界中&#xff0c;HTTP请求就像是对服务器的“魔法咒语”&#xff0c;它能让我们的Python程序与远方的服务器进行沟通&#xff0c;获取或发送数据。今天&#xff0c;我们就来聊聊Python中HTTP请求的基本方法&#xff0c;看看这些“咒语”是如何施展的。 首先&#xff0…

好书推荐丨《细说机器学习:从理论到实践》

文章目录 写在前面机器学习推荐图书内容简介编辑推荐作者简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家推荐一本有关机器学习的全新正版书籍&#xff0c;对机器学习、人工智能感兴趣的小伙伴们快来看看吧~ 机器学习 机器学习&#xff08;Machine Learning, ML&…

Go应用性能分析实战

Go很适合用来开发高性能网络应用&#xff0c;但仍然需要借助有效的工具进行性能分析&#xff0c;优化代码逻辑。本文介绍了如何通过go test benchmark和pprof进行性能分析&#xff0c;从而实现最优的代码效能。原文: Profiling Go Applications in the Right Way with Examples…

实现VLAN间通信以太网链路聚合与交换机堆叠、集群华为ICT网络赛道

10.实现VLAN间通信 10.1.使用路由器实现VLAN间通信 使用路由器物理接口 路由器三层接口作为网关&#xff0c;转发本网段前往其它网段的流量。 路由器三层接口无法处理携带VLAN Tag的数据帧&#xff0c;因此交换机上联路由器的接口需配置为Access. 路由器的一个物理接口作为一…

两次网脱+疑难白内障,眼科医生刀尖起舞为他挽回光明!

“不错&#xff0c;挺清楚的”“文件能看清了”“墙上的小字也能看见了”…… “好啦好啦&#xff0c;快别嘚瑟了&#xff01;”妻子在一旁抿嘴笑。 昨天刚做完白内障手术的Y先生&#xff0c;打开纱布后如释重负的心情溢于言表。 同坐在一间复查室里的&#xff0c;还有几位老…

【FPGA】高云FPGA之数字钟实验->HC595驱动数码管

高云FPGA之IP核的使用 1、设计定义2、设计输入2.1 数码管译码显示2.2 74HC595驱动2.3 主模块设计 3、分析和综合4、功能仿真6.1 hex8模块仿真6.2 HC595模块 5、布局布线6、时序仿真7、IO分配以及配置文件&#xff08;bit流文件&#xff09;的生成8、配置&#xff08;烧录&#…

Java实现人事管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员功能模块2.2 普通员工功能模块2.3 答辩文案 三、系统展示四、核心代码4.1 查询职称4.2 新增留言回复4.3 工资申请4.4 工资审核4.5 员工请假 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的人…

升级打造文物素养知识课堂 猿辅导「博物馆新知计划」第二站正式开启

普及文博知识、历史文化是一个长期的活动&#xff0c;它既需要利用多种方式进行&#xff0c;也需要多方人员共同参与。人们的文化素养的培养是一个长期的过程&#xff0c;是不能一蹴而就的&#xff0c;所以要想提高全民文化素养就要重视青少年的文化素养的培养&#xff0c;文化…

openai公司的chatgpt-3.5参数库内还未增加sora的语料信息

openai公司的chatgpt-3.5参数库内还未增加sora的语料信息&#xff01;我想通过openai公司的chatgpt3.5来了解一下关于sora的技术信息&#xff0c;结果呢&#xff0c;它竟然回答不知道sora是什么。看来&#xff0c;sora的语料库信息还未来得及加入chatgpt3.5的训练模型中。 如图…

【ArcGIS Pro二次开发】(82):玩个花活_控规指标块生成

一、要实现的效果 废话不多说&#xff0c;这次要实现的是类似控规指标块的标注&#xff1a; 这里只是示例&#xff0c;用了5个格子&#xff0c;做成9个格子也是可以的。 实现这个效果最关键的是要用到Pro中的复合标注。 关于复合标注的用法可以搜一下帮助里的【使用复合注释…

【软件使用】postman使用教程

​ &#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;软件安装及使用 ⛳️ 功不唐捐&#xff0c;玉汝于成 ​ 目录 前言 正文 步骤1&#xff1a;安装Postman 步骤2&#xff1a;发送请求 步骤3&#xff1a;管理环境变量 步骤4&#xff1…

ADS-B Receiver Module TT-SC1 for UAV and Drones

目录 Introduction Applications Main features Technical parameters Basic technical information Electrical specification Recommended operation conditions General electrical parameters Introduction TT-SC1 is a high quality and low price OEM ADS-B…

ACE 中的Active Object模式

Active Object 设计模式&#xff1a; 1&#xff09; 根据对象被调用的方式&#xff0c;可以将对象分为两类: Passive Object和Active Object。Passive 和 Object和调用者在同一个线程中&#xff0c;这就是我们通常所用的函数调用。而Active Object和调用在不同的线程中&#xf…

NestJS入门2:创建模块

前文参考&#xff1a; NestJS入门1 1. 创建user模块 在项目目录下输入以下命令 nest g resource user 执行完后会在src文件夹下创建出user文件夹及文件夹下相应的文件&#xff0c;如下 2. 增加打印 3. 测试 &#xff08;1&#xff09;POSTBody Postman 服务端的打印 &…

深度学习(16)--基于经典网络架构resnet训练图像分类模型

目录 一.项目介绍 二.项目流程详解 2.1.引入所需的工具包 2.2.数据读取和预处理 2.3.加载resnet152模型 2.4.初始化模型 2.5.设置需要更新的参数 2.6.训练模块设置 2.7.再次训练所有层 2.8.测试网络效果 三.完整代码 一.项目介绍 使用PyTorch工具包调用经典网络架构…

地下管线管网三维建模工具MagicPipe3D V3.4.2发布

经纬管网建模系统MagicPipe3D&#xff0c;本地离线参数化构建地下管网三维模型&#xff08;包括管道、接头、附属设施等&#xff09;&#xff0c;输出标准3DTiles服务、Obj模型等格式&#xff0c;支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析&…

新版Java面试专题视频教程——框架篇

新版Java面试专题视频教程——框架篇 框架篇 01-框架篇介绍02-Spring-单例bean是线程安全的吗03-Spring-AOP相关面试题04-Spring-事务失效的场景05-Spring-bean的生命周期5.1 BeanDefinition 06-Spring-bean的循环依赖(循环引用)6.1 一般对象的循环依…

算法沉淀——BFS 解决拓扑排序(leetcode真题剖析)

算法沉淀——BFS 解决拓扑排序 01.课程表02.课程表 II03.火星词典 Breadth-First Search (BFS) 在拓扑排序中的应用主要是用来解决有向无环图&#xff08;DAG&#xff09;的拓扑排序问题。拓扑排序是对有向图中所有节点的一种线性排序&#xff0c;使得对于每一条有向边 (u, v)&…

数据结构排序:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序

文章目录 插入排序希尔排序选择排序冒泡排序堆排序快速排序 插入排序 基本思想&#xff1a; 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a; 把待排序的值按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完…

matlab入门,在线编辑,无需安装matab

matlab相关教程做的很完善&#xff0c;除了B站看看教程&#xff0c;官方教程我觉得更加高效。跟着教程一步一步编辑&#xff0c;非常方便。 阅读 MATLAB 官方教程&#xff1a; MATLAB 官方教程提供了从基础到高级的教学内容&#xff0c;内容包括 MATLAB 的基本语法、数据处理…