引言:
用户管理

一.用户
1.用户信息
MySQL中的用户,都存储在系统数据库mysql的user表中


可以通过desc user初步查看一下表结构

字段解释:
host : 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆
user: 用户名
authentication_string: 用户密码通过password函数加密后的
*_priv: 用户拥有的权限
2.创建用户
语法:
sql
create user '用户名'@'登陆主机/ip' identified by '密码';

会发现新增用户hjq
此时便可以使用新账号新密码进行登陆啦
- 备注:可能实际在设置密码的时候,因为mysql本身的认证等级比较高,一些简单的密码无法设置,会爆出如下报错:
- ERROR 1819 (HY000): Your password does not satisfy the current policy****requirements
解决方法:先刷新一下权限表,然后再试一次:
flush privileges;
解决MySQL安装后因密码策略导致的自定义密码设置失败问题,通过调整密码强度等级及长度,实现简单密码设置。这个博客供大家学习
https://blog.csdn.net/zhanaolu4821/article/details/93622812
查看密码设置相关要求:SHOW VARIABLES LIKE 'validate_password%';
这个大家下来自己玩玩关于新增用户这里,需要大家注意,不要轻易添加一个可以从任意地方登陆的user。(注意安全问题的发生)
3.删除用户
语法:
sql
drop user '用户名'@'主机名'

4.修改用户密码
语法:
- 自己改自己密码
sql
set password=password('新的密码');
这个是mysql8.0的结果

原因:
这个错误是因为 MySQL 8.0 已经移除了 PASSWORD() 函数 ,并且 SET PASSWORD 的语法也发生了变化。
MySQL 5.7 及更早 :支持
SET PASSWORD = PASSWORD('123456');MySQL 8.0 :移除了
PASSWORD()函数,必须使用新语法
解决方案(MySQL 8.0)
方法1:使用 ALTER USER
sql
-- 修改当前用户的密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
-- 或者指定完整用户(如果 root 可以从任意主机连接)
ALTER USER 'root'@'%' IDENTIFIED BY '123456';
方法2:使用 SET PASSWORD 新语法
sql
-- MySQL 8.0 的正确写法(不推荐,但可用)
SET PASSWORD FOR 'root'@'localhost' = '123456';
-- 或者修改当前用户
SET PASSWORD = '123456';
试试mysql5.7的结果,这个可以跑通

- root用户修改指定用户的密码
sql
mysql8.0的方法
-- 不需要 PASSWORD() 函数,直接写字符串
SET PASSWORD FOR 'hjq'@'localhost' = '87654321';
mysql5.7的使用方法
set password for '用户名'@'主机名'=password('新的密码');

注意:关于有关密码的命令行,MySQL 不会记录下来,因此上下翻找不到。
核心原因:安全防护
这是 MySQL 客户端一个刻意设计的安全特性,而不是 Bug。
当你在
mysql命令行中输入IDENTIFIED BY '密码'或PASSWORD('密码')时,MySQL 客户端会检测到这些是敏感信息。为了避免密码泄露(例如其他用户查看历史记录、系统日志记录、屏幕录像等),客户端会跳过 将这些行写入历史文件(如~/.mysql_history)。
二.数据库的权限
MySQL数据库提供的权限列表:

1. 给用户授权
- 刚创建的用户没有任何权限。需要给用户授权。
语法:
sql
grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码']
说明:
- 权限列表,多个权限用逗号分开
- grant select on ...
- grant select, delete, create on ....
- grant all privileges on ... -- 表示赋予该用户在该对象上的所有权限
2.*.* : 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)
3.库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程等)
4.identified by可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户

这个错误是因为 MySQL 8.0 中 GRANT 命令不能再隐式创建用户。
错误原因
在 MySQL 8.0 之前,如果 GRANT 指定的用户不存在,MySQL 会自动创建该用户。但 MySQL 8.0 移除了这个特性,必须先显式创建用户,再授予权限。
解决方案
方法1:先创建用户,再授权
sql
-- 第一步:创建用户
CREATE USER 'zhangsan'@'%' IDENTIFIED BY '你的密码';
-- 第二步:授予权限
GRANT ALL ON rootDB.user TO 'zhangsan'@'%';
-- 第三步:刷新权限(可选)
FLUSH PRIVILEGES;
方法2:一条语句创建并授权(MySQL 8.0.20+)
sql
-- 使用 CREATE USER 并同时授权(需要密码)
CREATE USER 'zhangsan'@'%' IDENTIFIED BY 'password'
WITH GRANT OPTION;
GRANT ALL ON rootDB.user TO 'zhangsan'@'%';
完整操作示例
sql
-- 1. 创建用户(假设密码设为 '123456')
CREATE USER 'zhangsan'@'%' IDENTIFIED BY '123456';
-- 2. 授予 rootDB.user 表的所有权限
GRANT ALL ON rootDB.user TO 'zhangsan'@'%';
-- 3. 验证权限
SHOW GRANTS FOR 'zhangsan'@'%';
-- 4. 测试连接(另开终端)
-- mysql -u zhangsan -p -h 你的服务器IP
终端A:(使用root账号) 

在mysql5.7上直接输入结果如下:

终端B:(使用zhangsan账号)





在 MySQL 8.0 中,root 用户默认只有 'root'@'localhost',没有 'root'@'%'(允许任何主机连接的 root 用户)。
注意:如果发现赋权限后,没有生效,执行如下指令:
flush privileges;(刷新权限)
2.回收权限
语法:
sql
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
- 终端A(root)

- 终端B(zhangsan)

这里的插入权限没有了,不能插入
3.补充:
和 localhost 的区别在于:允许从什么地方连接到 MySQL 服务器。
核心区别
| 主机名 | 允许连接的位置 | 典型场景 |
|---|---|---|
localhost |
只能本机连接 | 服务器上的程序、本机命令行 |
% |
任何地方都能连接 | 你的笔记本电脑、其他服务器、远程应用 |
理解记忆:
把 MySQL 服务器想象成一栋大楼:
localhost= 只能从大楼内部的员工通道进入
%= 从大楼外部的任何门都能进(北京、上海、纽约...)
sql
用户 'zhangsan'@'localhost'
可以连接(在服务器本机上)
mysql -u zhangsan -p -h 127.0.0.1
mysql -u zhangsan -p -h localhost
不能连接(在你的笔记本电脑上)
mysql -u zhangsan -p -h 122.51.13.82
用户 'zhangsan'@'%'
可以连接(任何地方)
mysql -u zhangsan -p -h 127.0.0.1 # 本机
mysql -u zhangsan -p -h 122.51.13.82 # 远程
mysql -u zhangsan -p -h 你的公网IP # 其他网络
为什么要有两个?
原因安全考虑
| 用户 | 安全风险 | 适用场景 |
|---|---|---|
'root'@'localhost' |
低(只能本机连) | 管理员维护 |
'root'@'%' |
高(全世界都能试密码) | 强烈不推荐 |
'app'@'localhost' |
低 | 服务器上的本地程序 |
'app'@'192.168.1.%' |
中 | 只允许内网连接 |
'app'@'%' |
中高 | 需要远程访问的应用 |