直接改 mysql.user 表会失败,因 MySQL 8.0+ 默认用 caching_sha2_password 插件,需用 ALTER USER 或 phpMyAdmin“更改密码”功能并执行 FLUSH PRIVILEGES。
直接改 mysql.user 表会失败?先确认认证插件
php 8.0+ 和 mysql 8.0 默认用 caching_sha2_password 插件,而 phpmyadmin 的“用户账户”界面如果没选对插件,直接填密码保存后实际不生效——登录时仍报 access denied。
实操建议:
- 进 phpMyAdmin → 左侧点
mysql库 → 打开user表 → 找到目标用户名那一行,重点看plugin字段值 - 如果值是
caching_sha2_password,别手动改authentication_string字段;得用 SQL 或界面右上角“编辑权限”里的“更改密码”功能(它会自动调用ALTER USER) - 如果值是
mysql_native_password,才可以用界面直接编辑password字段(旧版字段名)或authentication_string(新版),但必须配合SET PASSWORD或ALTER USER刷新缓存,否则改了也白改
用 SQL 修改密码最稳,但语法因 MySQL 版本而异
phpMyAdmin 的 SQL 标签页是绕过界面限制的最快路径,但写错一条就锁死用户——比如在 MySQL 8.0 用 SET PASSWORD FOR 'u'@'h' = PASSWORD('x') 会报错 FUNCTION PASSWORD does not exist。
实操建议:
- MySQL 5.7 及以前:
SET PASSWORD FOR 'username'@'localhost' = PASSWORD('newpass'); - MySQL 8.0+:
ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpass';(想保留原插件就去掉WITH ...部分) - 执行完必须跟一句
FLUSH PRIVILEGES;,否则权限表不重载,新密码无效 - 注意单引号不能省,
@后面的 host 要和原记录完全一致(比如'%'和'localhost'是两个用户)
改完登不上?检查 host 匹配和连接协议
常见现象:密码明明改成功了,用命令行 mysql -u user -p 能登,但应用连不上,或者 phpMyAdmin 自己连不上那个用户——大概率是 host 不匹配或客户端用了 Unix socket。
立即学习“PHP免费学习笔记(深入)”;
实操建议:
- 查用户真实 host:
SELECT User, Host FROM mysql.user WHERE User = 'username';,确认你连的是'username'@'127.0.0.1'还是'username'@'localhost',这两个在 MySQL 里不等价 - 本地连接优先走 socket,
localhost会跳过 TCP;如果应用配置里 host 写的是127.0.0.1,就得确保用户有对应Host = '127.0.0.1'的记录 - phpMyAdmin 自身连接用的账号(通常是
root或配置文件里的$cfg['Servers'][$i]['auth_type']指定的)不受你改的其他用户影响,别误以为改错了 phpMyAdmin 的登录密码
批量重置多个用户密码?别手点,用生成 SQL
要改 10 个用户的密码,逐个进界面点“编辑权限”太慢,且容易漏掉 FLUSH PRIVILEGES。手动拼 SQL 又怕引号、转义出错。
实操建议:
- 先用查询导出用户列表:
SELECT CONCAT('ALTER USER ''', User, '''@''', Host, ''' IDENTIFIED BY ''newpass123'';') AS stmt FROM mysql.user WHERE User IN ('u1','u2','u3'); - 复制结果,在 SQL 标签页粘贴执行(记得末尾加
FLUSH PRIVILEGES;) - 别用
UPDATE mysql.user SET authentication_string = ...批量更新——MySQL 8.0+ 不认裸哈希值,且不会触发权限重载 - 生产环境操作前,先在测试库跑一遍,确认语句能执行且没语法错误



















