当前位置: 首页 > article >正文

MySQL——视图 用户管理 语言访问

目录

视图

用户管理

数据库权限

访问

准备工作

使用函数

mysql界面级工具

         连接池


视图

        这里的视图与事务中的读视图是两个不同的概念:视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图

        创建视图

        修改视图后对原表产生影响,修改原表会对视图产生影响

        原表数据发生了改变

        删除视图

                总结:使用视图时注意以下几点:

  • 与表一样,必须唯一命名(不能出现同名视图或表名);
  • 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响;
  • 视图不能添加索引,也不能有关联的触发器或者默认值;
  • 视图可以提高安全性,必须具有足够的访问权限;(它能从原表中把私密数据(如密码去除)后展示,修改视图也要影响原表)
  • order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图中的 order by 将被覆盖(但版本不同不一定会受影响)

用户管理

        与Linux一样:mysql也是要进行多用户进行管理,因为多用户使用存在着安全问题

        

        用户数据保存在 mysql 库中

        可能你在之前配置时mysql登录时root是无密码登录的,也就是: skip-grant-tables 模式,此时设置密码会报错,首次对表user 操作要先权限刷新才能设置/修改密码

        创建用户后也是要刷新权限后另一个客户端才能用新用户进行登录

        另一端登录成功

        @后面跟着用户登录的环境,localhost 代表他只能在本地进行登录;% 代表他能够在任意环境下进行登录 

         用户觉得碍眼可以把他进行删除

        此时另一端就登不上了

数据库权限

        mysql提供了很多权限

        登录root用户,给zzj用户emp的select权限   

         zzj用户就能看到scott数据库,但进入后只能看到emp

        只能继续select操作

        如果想要emp全部的权限,则root要这么干

         此时zzj就能进行操作了

        觉得zzj不能进行emp的如何操作,则可以把权限回收了

        此时zzj连scott库都看不到了

语言访问

        mysql是指令级别进行操作,而语言要想支持操作数据库,mysql就必须为我们提供各种库名与头文件,让我们在语言级别实现数据库的基本操作;如果之前在配置mysql时选择的是yum源配置mysql后通过yum源下载的mysql-community-server,那么就代表库也帮你下完了,不用你在进行去官网下载库在导进文件中了,但默认没给我们提供头文件这个需要自己下载mysql的devel文件

sudo yum install mysql-community-devel

        下载完后第一件是就是写代码来验证环境是否配置成功了

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

        进行编译时要指明对应链接的库,因为第三方库g++默认是不会自己找到即使它存在

g++ test.cc -L/lib64/mysql -l mysqlclient

        正确打印出mysql版本号就说明环境没问题

准备工作

        使用root账号创建空数据库并给普通用户(未来登录时使用它进行登录)库的所有操作权

        查看普通用户视角操作库

使用函数

        先进行数据库对象mysql初始化,接着链接时要设置各种配置信息(用户名,密码,端口号...),使用后对mysql进行关闭

#include<iostream>
#include<string>
#include<unistd.h>
#include<mysql/mysql.h>const std::string host="localhost";
const std::string user="zzj";
const std::string password="0628";
const std::string database="test_conn";
unsigned int port=3306;int main()
{//初始化MYSQL *mq=mysql_init(nullptr);if(mq==nullptr){std::cerr<<"mysql init fail"<<std::endl;return 1;}//远程链接数据库MYSQL* my=mysql_real_connect(mq,host.c_str(),user.c_str(),password.c_str(),database.c_str(),port,nullptr,0);if(my==nullptr){std::cerr<<"mysql connect fail"<<std::endl;return 1;}//添加等待进行观察sleep(10);std::cout<<"sucess"<<std::endl;//使用完后要关闭mysql_close(mq);return 0;
}

        运行程序后,我们确实通过上层访问到了数据库

         使用 mysql_query 函数将我们输入的字符串mysql语句在数据库内执行,就可以制作出一个简易版的mysql客户端

#include<iostream>
#include<string>
#include<unistd.h>
#include<mysql/mysql.h>const std::string host="localhost";
const std::string user="zzj";
const std::string password="0628";
const std::string database="test_conn";
unsigned int port=3306;int main()
{//初始化MYSQL *mq=mysql_init(nullptr);if(mq==nullptr){std::cerr<<"mysql init fail"<<std::endl;return 1;}//远程链接数据库MYSQL* my=mysql_real_connect(mq,host.c_str(),user.c_str(),password.c_str(),database.c_str(),port,nullptr,0);if(my==nullptr){std::cerr<<"mysql connect fail"<<std::endl;return 1;}std::string mysql;while(true){std::cout<<"Mysql> ";std::getline(std::cin,mysql);if(mysql=="quit" || mysql.empty()){std::cout<<"Bye"<<std::endl;break;}mysql_query(my,mysql.c_str());}//使用完后要关闭mysql_close(mq);return 0;
}

        我们输入在程序运行时输入的mysql语句成功地执行了

        但在这里有一个问题:怎么中文输入的字符串出现了乱码? 之前在配置mysql时默认是utf-8 支持汉字啊;问题不在这里,而在建立链接后访问数据库时它默认使用字符集latin1去访问的,需要使用 mysql_set_character_set() 设置下字符串下即可

         不用;语句也可以执行成功(函数默认只能执行一条语句,防止SQL注入);现在已经可以继续增删改操作了,查操作虽然也可以,但它执行结果后要给我们打印出数据信息才是我们要的;

        边框可以打印,要的是属性名与下面对应的内容,要怎么实现呢?

        先用 MYSQL_RES* mysql_store_result() 保存结果的所有数据,它是char**[] 数组;接着使用mysql_num_rows(MYSQL_RES *) 和 mysql_num_fields(MYSQL_RES *) 获取到行数与列数,注意传入的参数是前面的函数返回对象;获取总属性名使用 mysql_fetch_fields(MYSQL_RES *),它是 char*[]数组,打印时要根据列数才能打印完整;内容提供 mysql_fetch_row(MYSQL_RES *) 它也是char*[]数组,不过它只保存着第一行的内容,下次调用就返回第二行的内容...也是要根据行数与列数才能打印完整内容

#include<iostream>
#include<string>
#include<unistd.h>
#include<mysql/mysql.h>const std::string host="localhost";
const std::string user="zzj";
const std::string password="0628";
const std::string database="test_conn";
unsigned int port=3306;int main()
{//初始化MYSQL *mq=mysql_init(nullptr);if(mq==nullptr){std::cerr<<"mysql init fail"<<std::endl;return 1;}//远程链接数据库MYSQL* my=mysql_real_connect(mq,host.c_str(),user.c_str(),password.c_str(),database.c_str(),port,nullptr,0);if(my==nullptr){std::cerr<<"mysql connect fail"<<std::endl;return 1;}//设置utf-8字符集mysql_set_character_set(mq,"utf8");std::string mysql="select *from people";mysql_query(my,mysql.c_str());//获取结果的所有数据保存在MYSQL_RES对象中MYSQL_RES* res=mysql_store_result(my);//获取内容行和列(在MYSQL_RES中获取)int rows=mysql_num_rows(res);int fields=mysql_num_fields(res);//打印属性.属性相关保存在MYSQL_FIELD对象中MYSQL_FIELD *fields_at=mysql_fetch_fields(res);for(int i=0;i<fields;i++){std::cout<<fields_at[i].name<<' ';}std::cout<<std::endl;//打印内容for(int i=0;i<rows;i++){//相等与迭代器:调用一次跳转到下一行MYSQL_ROW row_content=mysql_fetch_row(res);for(int j=0;j<fields;j++){std::cout<<row_content[j]<<' ';}std::cout<<std::endl;}//使用完后是否结果集mysql_free_result(res);//使用完后要关闭mysql_close(mq);return 0;
}

         程序运行结果

        以上操作都是mysql为了支持C语言操作数据库提供的各种函数,像C++,Java也有自己的mysql库,需要查找文档后自行测试使用

mysql界面级工具

        mysql也支持使用界面的方式来连接数据库进行使用,以Winodws为例,先到官网下载:Download MySQL Workbench;在数据库中准备一个用户,host设置为‘%’表示任何地方都能连接;还要在my.cnf配置中添加:

bind-address=0.0.0.0
skip-networking = OFF

        下载完软件后,点击+填上对应的数据库用户信息

        填写完再次点击填好的信息就登录进来了(但我这边给用户开通了全部权限,在本地数据库上可以修改数据,但在图像化界面里修改不了数据,是BUG?)

连接池

        在正式的应用场景中,要怎么设计让使用者使用sql语句高效地在语言层面上执行呢?与前面数据的线程池类似:数据一个类,类中有线程和任务队列的成员变量,让每个线程先跑起来,把mysql对象初始化,等待任务到来;使用sql语句准备好后,把sql语句包装成任务队列中的对象:里面保存着sql语句字符串,相关执行的函数,标记位;任务到来后唤醒线程,让其中一个线程拿着一个任务执行mysql_query()函数;如果是select执行要返回处理结果后返回,就可以把方法绑定后传给线程,线程根据标记位执行回调函数后把处理完的数据给我们返回

以上便是全部内容,有问题欢迎在评论区指正,感谢观看! 

相关文章:

MySQL——视图 用户管理 语言访问

目录 视图 用户管理 数据库权限 访问 准备工作 使用函数 mysql界面级工具 连接池 视图 这里的视图与事务中的读视图是两个不同的概念&#xff1a;视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的…...

二、Sqoop 详细安装部署教程

作者&#xff1a;IvanCodes 日期&#xff1a;2025年6月2日 专栏&#xff1a;Sqoop教程 Apache Sqoop 是一个强大的工具&#xff0c;用于在 Hadoop (HDFS, Hive, HBase) 与关系型数据库 (如 MySQL, PostgreSQL, Oracle) 之间高效传输数据。本教程将详细指导您如何根据官方网站截…...

用Python开启游戏开发之旅

在当今丰富多彩的数字娱乐世界中&#xff0c;游戏以其独特的魅力吸引着无数人的目光。而Python这门功能强大又简洁易懂的编程语言&#xff0c;也为游戏开发打开了一扇充满创意的大门。 一、选择Python的理由 Python之所以备受游戏开发者青睐&#xff0c;有诸多原因。其一&#…...

React 第五十四节 Router中useRevalidator的使用详解及案例分析

前言 useRevalidator 是 React Router v6.4 引入的一个强大钩子&#xff0c;用于在数据路由&#xff08;Data Router&#xff09;中手动触发路由数据的重新验证&#xff08;revalidation&#xff09;。 它在需要主动刷新数据而不改变路由位置的场景中非常有用。 一、useReval…...

【C语言预处理详解(下)】--#和##运算符,命名约定,命令行定义 ,#undef,条件编译,头文件的包含,嵌套文件包含,其他预处理指令

目录 五.#和##运算符 5.1--#运算符 5.2--##运算符 六.命名约定&#xff0c;#undef&#xff0c;命令行定义 6.1--命名约定 6.2--#undef 6.3--命名行定义 七.条件编译 常见的条件编译指令&#xff1a; 1.普通的条件编译&#xff1a; 2.多个分支的条件编译(可以利用条…...

03.搭建K8S集群

K8S集群搭建的方式 目前主流的搭建k8s集群的方式有kubeadm、minikube、二进制包三种方式&#xff1a; kubeadm&#xff08;本案例搭建方式&#xff09; 是一个工具&#xff0c;用于快速搭建kubernetes集群&#xff0c;目前应该是比较方便和推荐的&#xff0c;简单易用 kubea…...

RDMA简介3之四种子协议对比

RDMA协议共有四种子协议&#xff0c;分别为InfiniBand、iWARP、RoCE v1和RoCE v2协议。这四种协议使用统一的RDMA API&#xff0c;但在具体的网络层级实现上有所不同&#xff0c;如图1所示&#xff0c;接下来将分别介绍这四种子协议。 图1 RDMA四种子协议网络层级关系图 Infin…...

【最新版】西陆洗车系统源码全开源+uniapp前端+搭建教程

一.系统介绍 一款基于ThinkPHPUniapp开发的多门店洗车系统&#xff0c;包含用户端&#xff08;小程序&#xff09;、门店员工端&#xff08;小程序&#xff09;、门店端&#xff08;PC&#xff09;、平台管理端&#xff08;PC&#xff09;。 门店分连锁门店和独立门店&#xf…...

力扣LeetBook数组和字符串--二维数组

1.旋转矩阵 题目链接 想了那么久的各种旋转&#xff0c;对角线&#xff0c;其实把问题搞复杂了。 旋转90度的本质无非就是转置镜像对称 转置是什么&#xff1f;&#xff1a;将矩阵的行和列互换。 镜像对称&#xff1a;把矩阵从中间对折&#xff0c;互换位置 矩阵 A A [ 1 3 0…...

Linux开发工具(apt,vim,gcc)

目录 yum/apt包管理器 Linux编辑器 vim 1.见一见vim 2.vim的多模式 3.命令模式底行模式等 4.vim的配置 Linux编译器 gcc/g 1.预处理&#xff08;宏替换&#xff09; 2.编译&#xff08;生成汇编&#xff09; 3.汇编&#xff08;生成机器可识别代码&#xff09; 4.连…...

C# ExcelWorksheet 贴图

C# ExcelWorksheet 贴图 在C#中,如果你想在Excel工作表中插入图片(例如,在ExcelWorksheet中贴图),你可以使用ClosedXML或EPPlus这样的库来操作Excel文件。下面我将分别介绍如何使用这两个库来实现这一功能。 使用ClosedXML 首先,确保你已经安装了ClosedXML包。你可以通…...

鸿蒙Next开发真机调试签名申请流程

背景&#xff1a; 在学习鸿蒙next开发应用的初期总是会遇到一堆的问题&#xff0c;毕竟鸿蒙next开发不管是他的ArKTS语言还是他的开发工具DevEco Studio都还在起步阶段&#xff0c;就像当初的Android起步一样&#xff0c;总会有资料不足的一些问题。就比如我们学习下载完DevEco…...

[yolov11改进系列]基于yolov11引入上下文锚点注意力CAA的python源码+训练源码

【CAA介绍】 本文记录的是基于CAA注意力模块的RT-DETR目标检测改进方法研究。在远程遥感图像或其他大尺度变化的图像中目标检测任务中&#xff0c;为准确提取其长距离上下文信息&#xff0c;需要解决大目标尺度变化和多样上下文信息时的不足的问题。CAA能够有效捕捉长距离依赖…...

【Elasticsearch】 查询优化方式

在优化Elasticsearch的查询性能时&#xff0c;可以从多个维度着手&#xff0c;包括索引设计、查询优化、集群配置、数据管理以及监控分析等。常见的优化方式和策略有以下几种&#xff1a; 一、索引优化 合理设计字段类型&#xff1a; 字段类型选择&#xff1a; 对于不需要分词的…...

Xcode 16.4 + iOS 18 系统运行时崩溃:___cxa_current_primary_exception 符号丢失的原因与解决方案

在使用 Xcode 16.4 构建项目&#xff0c;运行到 iOS 18.3 或更早版本系统&#xff08;包括模拟器&#xff09;时&#xff0c;出现了如下的运行时崩溃&#xff1a; dyld[22183]: Symbol not found: ___cxa_current_primary_exceptionReferenced from: /.../WidgetOn.app/Widget…...

【linux】全志Tina预编译一个so库文件到根文件系统/usr/lib/下

一、sdk中新建文件夹 路径&#xff1a; V:\t113\work3\t113\openwrt\package\feeds\libs\md5util md5util为需要注入的库文件夹。 文件结构 libs md5util files libmd5util.so makefile etc.. 二、编写makefile include $(TOPDIR)/rules.mkPKG_NAME : md5util PKG_VERSIO…...

C# 类和继承(成员访回修饰符)

成员访回修饰符 本章之前的两节阐述了类的可访问性。对类的可访问性&#xff0c;只有两种修饰符&#xff1a;internal和public。 本节阐述成员的可访问性。类的可访问性描述了类的可见性&#xff1b;成员的可访问性描述了类成员的可 见性。 声明在类中的每个成员对系统的不同…...

c++ stl容器之map用法

目录 &#xff08;1&#xff09;map介绍 &#xff08;2&#xff09;map、multimap、unordered_map区别 &#xff08;3&#xff09;map用法 1.map接口表 2.使用举例 插入数据与遍历数据 查找关键字和值 删除元素 按照值排序 &#xff08;4&#xff09;multimap用法 &…...

Linux-文件管理及归档压缩

1.根下的目录作用说明&#xff1a; /&#xff1a;Linux系统中所有的文件都在根下/bin&#xff1a;(二进制命令目录)存放常用的用户命令/boot&#xff1a;系统启动时的引导文件&#xff08;内核的引导配置文件&#xff0c;grub配置文件&#xff0c;内核配置文件&#xff09; 例…...

结合Jenkins、Docker和Kubernetes等主流工具,部署Spring Boot自动化实战指南

基于最佳实践的Spring Boot自动化部署实战指南,结合Jenkins、Docker和Kubernetes等主流工具,提供从环境搭建到生产部署的完整流程: 一、环境准备与工具选型​​ ​​1.基础设施​​ ​​Jenkins服务器​​:安装Jenkins LTS版本,配置JDK(推荐JDK 11+)及Maven/Gradle插…...

微软认证考试科目众多?该如何选择?

在云计算、人工智能、数据分析等技术快速发展的今天&#xff0c;微软认证&#xff08;Microsoft Certification&#xff09;已成为IT从业者、开发者、数据分析师提升竞争力的重要凭证。但面对众多考试科目&#xff0c;很多人不知道如何选择。本文将详细介绍微软认证的考试方向、…...

MCP协议在LLM系统中的架构与实现原理研究

MCP协议的角色和功能定位 模型上下文协议(Model Context Protocol, MCP) 是由Anthropic公司(Claude模型的发布方)提出的一种开放协议,旨在标准化大型语言模型(LLM)与外部数据源、工具和服务之间的交互方式。可以将MCP类比为AI应用的“USB-C接口”:通过统一的接口协议,…...

Dify工作流实践—根据word需求文档编写测试用例到Excel中

前言 这篇文章依赖到的操作可查阅我之前的文章&#xff1a; dify里的大模型是怎么添加进来的&#xff1a;在Windows本地部署Dify详细操作 flask 框架app.route()函数的开发和调用&#xff1a;PythonWeb开发框架—Flask工程创建和app.route使用详解 结构化提示词的编写&…...

【LC实战派】小智固件编译

这篇写给立创吴总&#xff0c;是节前答应他配合git代码的说明&#xff1b;也给所有对小智感兴趣的小伙伴。 请多提意见&#xff0c;让这份文档更有价值 - 第一当然是拉取源码 - git clone https://github.com/78/xiaozhi-esp32.git 完成后&#xff0c;先查看固件中实际的…...

HTTP(超文本传输协议)详解

目录 一、基本概念 二、HTTP报文&#xff08;结构&#xff09; (一) 请求报文 (二) 响应报文 三、HTTP请求方法 1. GET方法 2. POST方法 3. PUT方法 4. HEAD方法 5. DELETE 6. OPTIONS 一、知识扩展 7. TRACE 8. CONNECT 四、HTTP持久通信 (一) HTTP keep-alive…...

Unity安卓平台开发,启动app并传参

using UnityEngine; using System;public class IntentReceiver : MonoBehaviour {public bool isVR1;void Start(){Debug.LogError("app1111111111111111111111111");if (isVR1){LaunchAnotherApp("com.HappyMaster.DaKongJianVR2");}else{// 检查是否有传…...

jdbcTemplate.query备忘录

jdbcTemplate.query中使用全部字符串和参数注入&#xff0c; 查询速度为什么差距这么大 如何正确使用JdbcTemplate参数化查询 1、使用?占位符 String sql "SELECT * FROM users WHERE name LIKE ?"; List<User> users jdbcTemplate.query(sql,new Object[…...

如何搭建Z-Blog PHP版本:详细指南

Z-Blog是一款功能强大且易于使用的博客平台&#xff0c;支持PHP和ASP两种环境。本文将重点介绍如何在PHP环境下搭建Z-Blog博客系统&#xff0c;帮助您快速上线自己的个人博客站点。 准备工作 1. 获取Z-Blog PHP版本 首先&#xff0c;访问Z-Blog官方网站下载最新版本的Z-Blog…...

Docker 常用命令详解

&#x1f433; Linux 安装 Docker 及常用命令详解&#xff08;适用于 Ubuntu&#xff09; &#x1f4e6; 一、安装 Docker&#xff08;Ubuntu 系统&#xff09; 1. 更新系统 sudo apt update sudo apt upgrade -y2. 安装必要依赖 sudo apt install -y apt-transport-https …...

uniapp uni-id-co errCode“:“uni-id-captcha-required“,“errMsg“:“Captcha required

连续登录失败后就会出现图形验证码校验&#xff0c;如果前端不需要图形验证码校验&#xff0c;uni-id-co文件夹下找到module下的login文件夹下的login.js,注释掉Captcha相关校验&#xff0c;关掉即可 const {preLoginWithPassword,postLogin } require(../../lib/utils/login)…...