【MySQL】mysql connect
目录
一、准备工作
1、创建mysql用户
2、删除用户
3、修改用户密码
3.1、自己改自己密码
3.2、root用户修改指定用户的密码
4、数据库的权限
4.1、给用户授权
4.2、回收权限
二、连接mysql client
1、安装mysql客户端库
2、验证是否引入成功
三、 mysql接口
1、初始化数据库
2、连接数据库
3、下发mysql命令mysql_query
4、获取执行结果mysql_store_result
一、准备工作
1、创建mysql用户
使用创建用户命令,创建一个mysql用户:
create user '用户名'@'登陆主机/ip' identified by '密码';
如果因为首次进入MySQL导致创建用户失败,出现如下报错:
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
则可以先使用mysql的刷新指令:
flush privileges;
刷新完毕后即可创建成功。
2、删除用户
drop user '用户名'@'主机名'
3、修改用户密码
3.1、自己改自己密码
set password=password('新的密码');
3.2、root用户修改指定用户的密码
set password for '用户名'@'主机名'=password('新的密码');
4、数据库的权限
MySQL数据库提供的权限列表:
4.1、给用户授权
刚创建的用户没有任何权限。需要给用户授权。
grant 权限列表 on 库.对象名 to '用户名'@'登陆位置'
权限列表,多个权限用逗号分开:
grant select on ...
grant select, delete, create on ....
grant all [privileges] on ... -- 表示赋予该用户在该对象上的所有权限
- *.* : 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)
- 库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程等)
4.2、回收权限
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
二、连接mysql client
1、安装mysql客户端库
直接使用yum源进行安装:
sudo yum install mysql-devel

2、验证是否引入成功
#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

可以查看到当前mysql客户端的版本号。
三、 mysql接口
1、初始化数据库
初始化库需要调用函数:
MYSQL *mysql_init(MYSQL *mysql);
例如:
#include <iostream>
#include <mysql/mysql.h>int main()
{MYSQL* my = mysql_init(nullptr);if(nullptr == my){std::cerr << "init MYSQL err" << std::endl;return 1;}return 0;
}
2、连接数据库
初始化完毕之后,必须先链接数据库,在进行后续操作。(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函数中各参数,基本都是顾名思意。
例如:
#include <iostream>
#include <mysql/mysql.h>
#include <string>const std::string host = "127.0.0.1";
const std::string user = "connect";
const std::string password = "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 err" << std::endl;return 1;}if(mysql_real_connect(my, host.c_str(), user.c_str(), password.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::cout << "connect success" << std::endl;mysql_close(my);return 0;
}
运行观察结果:

3、下发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 password = "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 err" << std::endl;return 1;}if(mysql_real_connect(my, host.c_str(), user.c_str(), password.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::cout << "connect success" << std::endl;std::string sql;while(true){std::cout << "MySQL>>> ";if(!std::getline(std::cin, sql) || sql == "quit"){std::cout << "MySQL>>> bye bye" << std::endl;break;}int n = mysql_query(my, sql.c_str());if(n == 0)std::cout << sql << "success: " << n << std::endl;elsestd::cerr << sql << " failed: " << n << std::endl;}mysql_close(my);return 0;
}

再例如:
std::string sql = "update user set name='Jimmy' where id = 1";
int n = mysql_query(my, sql.c_str());
if (n == 0)std::cout << sql << "success" << std::endl;
elsestd::cout << sql << "failed" << std::endl;

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

MYSQL_RES结构体可以行列为单位把查询得到的表结构数据组织好。
在我们使用mysql_query函数进行查询结果后,对应的数据就被存放进了MYSQL结构体响应的空间中,此时我们再调用mysql_store_result函数,把这部分数据转储进 MYSQL_RES结构体里。
MYSQL_RES *res = mysql_store_result(my);
if (nullptr == res)
{std::cerr << "mysql_store_result error" << std::endl;return 4;
}
该函数会调用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_FIELD中存储列的所有属性信息:

使用方法:
int rows = mysql_num_rows(res);
int fields = mysql_num_fields(res);
MYSQL_FIELD *field = mysql_fetch_fields(res);
for (int i = 0; i < fields; i++)
{std::cout << field[i].name << " ";
}
std::cout << std::endl;
获取结果内容mysql_fetch_row:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.就当成一个二维数组来用吧。
for (int i = 0; i < rows; i++)
{MYSQL_ROW line = mysql_fetch_row(res);for (int j = 0; j < fields; j++){std::cout << line[j] << "\t";}std::cout << "\n";
}
释放MYSQL_RES结构体函数:
mysql_free_result(MYSQL_RES* res);
关闭mysql链接mysql_close:
void mysql_close(MYSQL *sock);相关文章:
【MySQL】mysql connect
目录 一、准备工作 1、创建mysql用户 2、删除用户 3、修改用户密码 3.1、自己改自己密码 3.2、root用户修改指定用户的密码 4、数据库的权限 4.1、给用户授权 4.2、回收权限 二、连接mysql client 1、安装mysql客户端库 2、验证是否引入成功 三、 mysql接口 1、初…...
基于 vue2 发布 npm包
背景:组件化开发需要,走了一遍发布npm包的过程,采用很简单的模式实现包的发布流程,记录如下。 项目参考:基于vue的时间播放器组件,并发布到npm_timeplay.js_xmy_wh的博客-CSDN博客 1、项目初始化 首先&a…...
基于Axios完成前后端分离项目数据交互
一、安装Axios npm i axios -S 封装一个请求工具:request.js import axios from axios// 创建可一个新的axios对象 const request axios.create({baseURL: http://localhost:9090, // 后端的接口地址 ip:porttimeout: 30000 })// request 拦截器 // 可以自请求…...
时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比
时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比 目录 时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比效果一览基本描述程序设计参考资料 效果一览 基本描述 MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比。 1.Matlab实现PSO-BiLSTM和BiLSTM…...
C# 生成唯一ID
1.首先通过nuget安装yitter.idgenerator 下面的三行代码搞定...
python怎么提取视频中的音频
目录 操作步骤 1. 安装MoviePy库: 2. 导入MoviePy库和所需的模块: 3. 提取音频: 可能遇到的问题 1. 编解码器支持: 2. 依赖项安装: 3. 文件路径问题: 4. 内存消耗: 5. 输出文件大小&a…...
学习设计模式之建造者模式,但是宝可梦
前言 作者在准备秋招中,学习设计模式,做点小笔记,用宝可梦为场景举例,有错误欢迎指出。 建造者模式 建造者模式是一种创建型模式,主要针对于某一个类有特别繁杂的属性,并且这些属性中有部分不是必须的。…...
数学建模:变异系数法
🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 变异系数法 变异系数法的设计原理是: 若某项指标的数值差异较大,能明确区分开各被评价对象,说明该指标的分辨信息丰富,因而应给该指标以较大的权重…...
paddle.load与pandas.read_pickle的速度对比(分别在有gpu 何无gpu 对比)
有GPU 平台 测试通用代码 import time import paddle import pandas as pd# 测试paddle.load start_time time.time() paddle_data paddle.load(long_attention_model) end_time time.time() print(f"Paddle load time: {end_time - start_time} seconds")# 测试…...
探讨uniapp的路由与页面栈及参数传递问题
1首先引入页面栈 框架以栈的形式管理当前所有页面, 当发生路由切换的时候,页面栈的表现如下: 页面的路由操作无非:初始化、打开新页面、页面重定向、页面返回、tab切换、重加载。 2页面路由 uni-app 有两种页面路由跳转方式&am…...
字节一面:你能讲一下跨域吗
前言 最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,作为一名前端开发工程师,我们日常开发中与后端联调时一定会遇到跨域的问题,只有处理好了跨域才能够与后端交互完成需求,所以深入学习跨域…...
leetcode 563.二叉树的坡度
⭐️ 题目描述 🌟 leetcode链接:https://leetcode.cn/problems/binary-tree-tilt/description/ 代码: class Solution { public:int childFind(TreeNode* root , int& sumTile) {if (root nullptr) {return 0; // 空树坡度为0}int l…...
【第1章 数据结构概述】
目录 一. 基本概念 1. 数据、数据元素、数据对象 2. 数据结构 二. 数据结构的分类 1. 数据的逻辑结构可分为两大类:a. 线性结构;b. 非线性结构 2. 数据的存储结构取决于四种基本的存储方法:顺序存储、链接存储、索引存储、散列存储 3. …...
【附安装包】MyEclipse2019安装教程
软件下载 软件:MyEclipse版本:2019语言:简体中文大小:1.86G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.5GHz 内存4G(或更高)下载通道①百度网盘丨下载链接:https://pan.baidu.co…...
poi-tl设置图片(通过word模板替换关键字,然后转pdf文件并下载)
选中图片右击 选择设置图片格式 例如word模板 maven依赖 <!-- java 读取word文件里面的加颜色的字体 转pdf 使用 --><dependency><groupId> e-iceblue </groupId><artifactId>spire.doc.free</artifactId><version>3.9.0</ver…...
[element-ui] el-tree 懒加载load
懒加载:点击节点时才进行该层数据的获取。 注意:使用了懒加载之后,一般情况下就可以不用绑定:data。 <el-tree :props"props" :load"loadNode" lazy></el-tree>懒加载—由于在点击节点时才进行该层数据的获取…...
【C++】使用 nlohmann 解析 json 文件
引言 nlohman json GitHub - nlohmann/json: JSON for Modern C 是一个为现代C(C11)设计的JSON解析库,主要特点是 易于集成,仅需一个头文件,无需安装依赖 易于使用,可以和STL无缝对接,使用体验…...
Nginx到底是什么,他能干什么?
目录 Ngnix是什么,它是用来做什么的呢? 一。Nginx简介 二,为什么要用Nginx呢? 二。Nginx应用 1.HTTP代理和反向代理 2.负载均衡 Ngnix是什么,它是用来做什么的呢? 一。Nginx简介 Nginx是enginex的简写&…...
如何判断一个java对象还活着
引用计数算法 引用计数器的算法是这样的:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 缺点&#x…...
Go语言基础之结构体
Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。 类型别名和自定义类型 自定义类型 在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...
