PHP连不上MySQL 8.0首要检查mysql.user表中目标用户的plugin列是否为caching_sha2_password;若是,需用ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd'显式切换插件并FLUSH PRIVILEGES,且PHP驱动须为mysqlnd 5.0.12+(对应PHP 7.4+)才原生支持新认证协议。

PHP 连不上 MySQL 8.0?先查 plugin 列是不是 caching_sha2_password
很多 PHP 应用升级 MySQL 到 8.0 后突然报错,比如 mysqli_connect(): (HY000/2054): The server requested authentication method unknown to the client,或者 PDO 报 Authentication plugin 'caching_sha2_password' cannot be loaded。这不是密码错了,也不是网络不通,而是握手阶段就失败了——PHP 客户端压根不认识这个新插件。
关键动作是登录 MySQL(用宝塔终端、mysql -u root -p 或跳板机),执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_php_user';
如果 plugin 列显示 caching_sha2_password,那就对上了。注意:哪怕你刚重设过密码(SET PASSWORD),只要没显式换插件,它还是用原来的认证方式。
ALTER USER 必须带 IDENTIFIED WITH,不能只写 IDENTIFIED BY
这是最容易踩的坑。下面这两条命令效果完全不同:
立即学习“PHP免费学习笔记(深入)”;
ALTER USER 'app'@'localhost' IDENTIFIED BY '123';
→ 只改密码哈希值,插件保持不变(仍是caching_sha2_password)ALTER USER 'app'@'localhost' IDENTIFIED WITH mysql_native_password BY '123';
→ 显式切换认证插件,老版 PHP 就能连了
操作时注意几点:
- 必须用已有权限的账号(如
root)登录后执行 - 如果用户是
'app'@'%',host 部分要严格匹配,别漏掉% - 执行完立刻生效,无需重启 MySQL
- 记得跟一句
FLUSH PRIVILEGES;确保权限表刷新
PHP 驱动版本太低?mysqlnd 不支持也白搭
即使你把用户插件切成了 mysql_native_password,PHP 仍可能连不上——根源在底层驱动。
- PHP 7.2 及更早版本自带的
mysqlnd驱动不实现caching_sha2_password握手流程,也不处理 RSA 公钥交换 - 即使你强制用了新插件,它连“握手协议都解析不了”,直接断连
验证方法:在 PHP 中运行 var_dump(mysqli_get_client_info());,看输出是否含 mysqlnd 及其版本号。低于 mysqlnd 5.0.12(对应 PHP 7.4+)基本都不可靠。
临时解法只有两个:
- 把用户插件切回
mysql_native_password(上一节已说) - 或升级 PHP 至 7.4+ 并确认
mysqlnd已启用(不是libmysql)
云环境(如宝塔)里常默认装旧版 PHP,这点比插件切换更隐蔽。
my.cnf 里改 default_authentication_plugin 只影响新用户
有人看到文档说“加一行 default_authentication_plugin=mysql_native_password 就行”,于是去 /www/server/mysql/etc/my.cnf(宝塔路径)或 /etc/mysql/mysql.conf.d/mysqld.cnf 修改,然后重启 MySQL——结果 PHP 还是连不上。
原因很简单:这个配置项只决定后续 CREATE USER 时的默认插件,对已存在的用户完全无效。你数据库里所有老用户(包括 root、app)依然用原来的 caching_sha2_password。
所以正确顺序是:
- 先确认哪些用户实际被 PHP 使用(别改错账号)
- 对每个目标用户单独执行
ALTER USER ... IDENTIFIED WITH ... - 如果还要新建用户,再考虑加配置项并重启
另外注意:default_authentication_plugin 在 MySQL 8.0.25+ 已被官方标记为“不推荐”,未来版本可能移除,别当长期方案用。
真正麻烦的从来不是改哪一行 SQL,而是得同时盯住 MySQL 用户表、PHP 驱动版本、连接池配置、以及云服务商是否悄悄拦截了 RSA 公钥交换——这些环节只要一个没对上,连接就卡在认证第一步。



















