本质是phpEnv内置旧版MySQL客户端不支持MySQL 8.0默认的caching_sha2_password认证协议,需改服务端用户插件为mysql_native_password或升级客户端支持。

phpEnv 里 MySQL 8.0 连接报 caching_sha2_password 错误,本质是客户端不认新插件
phpEnv 自带的 PHP 和 MySQL 客户端(比如 mysqlnd 或旧版 libmysqlclient)默认不支持 MySQL 8.0 的 caching_sha2_password 认证协议。错误现象通常是:PHP 脚本连接时抛出 Authentication plugin 'caching_sha2_password' cannot be loaded,或 Navicat / DBeaver 等工具在 phpEnv 环境下连不上本地 MySQL 8.0。
这不是 phpEnv 配置错了,而是它捆绑的 MySQL 客户端版本偏低(常见为 5.7 兼容级),而 MySQL 8.0 服务端默认要求新认证方式。关键点在于:phpEnv 本身不控制 MySQL 服务端加密逻辑,只提供客户端运行环境。
确认当前用户用的是哪个认证插件
先登录 MySQL 服务端(用管理员权限执行 mysql -u root -p),查清楚问题账户实际使用的插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
如果返回结果中 plugin 列是 caching_sha2_password,那就坐实了问题根源。注意:即使你改过密码,MySQL 8.0 默认仍会沿用该插件,除非显式指定。
立即学习“PHP免费学习笔记(深入)”;
-
mysql_native_password表示老式 SHA-1 加密,兼容性好但安全性弱 -
caching_sha2_password是 MySQL 8.0 默认,需客户端支持 SHA-256 + RSA 公钥交换 - 部分 phpEnv 版本附带的 PHP 可能编译自较老的 MySQL Connector/C,压根没启用
caching_sha2_password支持
两种解法:改服务端 or 升客户端,选哪个取决于环境
在 phpEnv 这类本地开发环境中,优先推荐改服务端认证方式——操作快、见效准、不依赖外部更新。但必须清楚代价:
- 执行
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; - 别忘了
FLUSH PRIVILEGES; - 如果用户是
'root'@'%'或其他 host,请对应修改,否则远程连接仍失败 - 此操作不影响数据库数据,只改认证握手流程;但会削弱传输层之外的密码保护强度
若你在 phpEnv 中还跑着需要高安全验证的测试服务(比如模拟 OAuth 登录链路),或未来要迁移到生产 MySQL 8.0 集群,则建议升级 phpEnv 内置的 PHP 扩展:替换 php_mysqlnd.dll 为支持 caching_sha2 的新版,或手动编译启用了 --with-mysql-sock 和 --enable-mysqlnd 的 PHP。不过这条路容易引发扩展冲突,调试成本远高于改一条 SQL。
Navicat / DBeaver 在 phpEnv 下连不上?检查驱动和连接参数
phpEnv 本身不干涉外部 GUI 工具,但这些工具若通过 phpEnv 的 MySQL bin 目录找客户端库(比如调用 mysql.exe),就可能复用旧版 client。此时光改用户插件还不够,还要看连接串是否带强制公钥参数:
- Navicat 12 及更早版本:必须升级到 v15+ 才原生支持
caching_sha2_password;降级插件后无需额外设置 - DBeaver:在连接配置的「Driver Properties」里加
allowPublicKeyRetrieval=true和useSSL=false(仅限内网可信环境) - 命令行测试:用 phpEnv 自带的
mysql.exe连接时加--default-auth=mysql_native_password参数可临时绕过
真正容易被忽略的是:改完用户插件后,有些工具(尤其是 Navicat)会缓存连接配置,必须彻底关闭再重开,甚至删掉连接后重建,否则仍按旧插件尝试握手。



















