mysql 8默认使用caching_sha2_password认证插件,而php 7.4之前版本或旧扩展不支持,导致连接报错;解决方法是执行alter user 'user'@'host' identified with mysql_native_password by 'pwd'并flush privileges。

PHP 连不上 MySQL 8,报错 The server requested authentication method unknown to the client [caching_sha2_password] 或 Plugin caching_sha2_password could not be loaded,基本就是这个原因:MySQL 8.0 默认用 caching_sha2_password 做用户认证,而老版本 PHP(尤其是 7.4 之前)或部分扩展(如旧版 mysqli、pdo_mysql)压根不认识它。
查当前用户的认证插件是什么
先别急着改,确认问题是否真出在这儿。进 MySQL 命令行执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
重点看 plugin 列。如果是 caching_sha2_password,且你用的是 PHP 7.3 及更早、或者没更新扩展的环境,那八成就是它了。注意 user 和 host 必须完全匹配,比如 'app_user'@'%' 和 'app_user'@'localhost' 是两个不同用户,得分别处理。
ALTER USER 改认证方式最直接有效
不用动配置文件,也不用重启 MySQL,对单个用户执行一条 SQL 就能解决:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';FLUSH PRIVILEGES;
这条命令会重设密码并强制改用兼容性更好的 mysql_native_password 插件。注意两点:一是 your_user 和 %(或 localhost)必须和 SELECT 查出来的完全一致;二是如果提示 ERROR 1396 (HY000),说明用户不存在,先用 CREATE USER 补上再改。
云数据库(如阿里云 RDS)只能走用户级修复
像阿里云 RDS、腾讯云 CDB 这类托管服务,/etc/my.cnf 或全局 default_authentication_plugin 是锁死的,你没法改。这时候唯一靠谱的路就是上面那条 ALTER USER。新建用户时也得手动指定插件:
CREATE USER 'new_user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass123';
否则新用户默认还是 caching_sha2_password,一样连不上。
PHP 代码和扩展本身不需改,但得确保加载了
mysqli 和 pdo_mysql 扩展必须启用,否则连报错都看不到。检查 php.ini 中这两行没被注释:
extension=mysqliextension=pdo_mysql
改完记得重启 PHP-FPM 或 Apache。另外,本地开发用 localhost 有时会触发 DNS 解析,导致连接慢甚至失败,建议数据库配置里写 127.0.0.1 而不是 localhost。
真正容易被忽略的是 host 匹配精度和云环境权限限制——很多问题不是密码错了,而是你 ALTER 的用户根本不是 PHP 实际连接的那个。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











