mysql 8.0连接报错“caching_sha2_password cannot be loaded”是因php 7.x旧版mysqlnd不支持该插件,需执行alter user 'root'@'host' identified with mysql_native_password by 'pwd'并flush privileges;注意host须匹配(如localhost/127.0.0.1/%),且default_authentication_plugin配置对存量用户无效。

MySQL 8.0 默认用 caching_sha2_password,而 PHP 7.x(尤其是 7.1–7.3)自带的 mysqlnd 或 libmysql 客户端库压根不识别这个插件——连接在 TCP 握手第一阶段就断了,报错 The server requested authentication method unknown to the client 或 SQLSTATE[HY000] [2054],不是密码错,是协议根本对不上。
怎么确认是 caching_sha2_password 搞的鬼
登录 MySQL 命令行,执行:SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
重点看 plugin 列是否为 caching_sha2_password,同时核对你要连的 host 是 'localhost'、'127.0.0.1' 还是 '%'——这三个在 MySQL 里互不等价,改错一个照样连不上。
-
phpEnv 或 XAMPP 环境下,
phpinfo()显示的Client API version是 5.7.x 或更老,基本可锁定问题 - 命令行
mysql -u root -p能连,但 PHP 脚本连不上,说明是客户端库兼容性问题,不是网络或权限问题 - Navicat / DBeaver 报错
Authentication plugin 'caching_sha2_password' cannot be loaded,也是同一根源
ALTER USER 切插件时最常踩的三个坑
只改插件不带密码、只设密码不指定插件、改完不刷权限——三者任一出错都会导致锁死自己或无效。
- 必须同时指定插件和密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 如果 PHP 用
127.0.0.1连(Navicat 默认),还得单独处理:ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 改完立刻执行:
FLUSH PRIVILEGES;,否则变更不生效 - 密码含
@、/、!等字符时,命令行连接要加单引号:mysql -uroot -p'pass!@#'
改了 my.cnf 为什么还是连不上
default_authentication_plugin = mysql_native_password 只影响新创建的用户,对已存在的 root、appuser 等完全无效。重启 MySQL 后,新建用户才走新插件,老用户 plugin 字段纹丝不动。
- 云数据库(阿里云 RDS、腾讯云 CDB)通常禁写配置文件,这条路直接走不通
- Docker 启动加
--default-authentication-plugin=mysql_native_password同样不修复存量用户 - phpEnv 的
my.ini改了也得重启 MySQL 服务,且仍需手动ALTER USER才能生效
真正容易被忽略的是客户端缓存:Navicat 会记住握手参数,改完服务端不关掉重开软件,它还在用旧流程重试;PHP 连接池或 Apache 子进程没重启,旧连接逻辑还在跑——这些比插件切换本身更常导致“明明改了却还是连不上”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











