应将MySQL用户认证方式改为mysql_native_password。执行ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';即可,无需重启MySQL,PHP连接代码无需修改。

PHP 连 MySQL 8 报 caching_sha2_password 认证失败咋办
MySQL 8 默认用 caching_sha2_password 插件做用户认证,而 PHP 7.4 之前(尤其 Windows 下的旧版 mysqli / PDO)压根不支持它——连上去直接报错:Authentication plugin 'caching_sha2_password' cannot be loaded 或 Client does not support authentication protocol。这不是密码错了,是“语言不通”。
改 MySQL 用户认证方式最稳(推荐)
让 MySQL 用户退回到 PHP 全版本都认的 mysql_native_password,一劳永逸。注意:不是改全局默认插件(default_authentication_plugin),而是改具体用户。
- 登录 MySQL(用 root 或有权限账号):
mysql -u root -p - 执行(把
your_user和your_password换成实际值):ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
- 立刻生效,不用重启 MySQL;如果用户是
'your_user'@'localhost',记得把%换成localhost - PHP 连接代码完全不用动,
mysqli或PDO照常工作
升级 PHP + 扩展也能解(但有条件)
PHP 7.4+ 原生支持 caching_sha2_password,但得满足两个硬条件:
- PHP 编译时链接的是 MySQL 8.0+ 的客户端库(
libmysqlclient或mysqlnd8.0+);仅升级 PHP 版本不够,还得看底层 client lib - Windows 用户特别注意:官方 PHP Windows 包从 7.4 起才自带兼容的 mysqlnd,旧版(如 7.3.x)即使打补丁也极难稳定支持
- Linux 下可通过
php -i | grep "Client API version"查 client 版本;若显示mysqlnd 8.0.x且 PHP ≥ 7.4,再确认连接时没强制指定旧驱动
PDO 连接时加 ATTR_EMULATE_PREPARES 是掩耳盗铃
有人试过在 PDO DSN 后加 &attr=PDO::ATTR_EMULATE_PREPARES,true 或设 PDO::ATTR_EMULATE_PREPARES = true,但这跟认证方式无关——它只影响预处理语句是否由 PHP 模拟,不解决握手阶段的插件协商问题。该报错照样报。
立即学习“PHP免费学习笔记(深入)”;
真正卡在连接第一帧:TCP 建连 → MySQL 发起 auth challenge → PHP 客户端不认识 caching_sha2_password → 直接断开。后面所有配置都还没机会生效。










