确认是caching_sha2_password导致连接失败:执行select user, host, plugin from mysql.user where user = 'your_username',若plugin为caching_sha2_password且客户端为旧版php等不支持该插件,则需用alter user精确匹配host修改为mysql_native_password并执行flush privileges。

直接改用户认证插件最有效,caching_sha2_password不是密码错了,是旧版 PHP 客户端压根不认识它——握手阶段就断开,连错误日志都可能只显示“unknown authentication method”。
怎么确认是 caching_sha2_password 搞的鬼
登录 MySQL 命令行,执行:SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
如果 plugin 列返回 caching_sha2_password,且你用的是 PHP 7.4 以下、或没更新 pdo_mysql 扩展的环境(比如 phpEnv、宝塔默认 PHP 包),基本就是它。
- 必须精确匹配
host:连的是'root'@'127.0.0.1',就不能只改'root'@'localhost' - 云数据库(如阿里云 RDS)不让你改配置文件,
ALTER USER是唯一路径 - 某些客户端(Navicat、DBeaver)会缓存握手参数,改完服务端后得彻底关掉重开
ALTER USER 改插件时最容易踩的坑
只写 IDENTIFIED WITH mysql_native_password 不带密码,会导致密码被清空;只重设密码不指定插件,plugin 字段不变——两者必须同时做。
- 正确写法:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 改完必须执行:
FLUSH PRIVILEGES;,否则变更不生效 - 如果 PHP 脚本用
127.0.0.1连(多数默认行为),还得单独处理'root'@'127.0.0.1' - 密码含
@、/、!等字符时,命令行连接要加单引号:mysql -uroot -p'pass!@#'
为什么改了 my.cnf 还是连不上
default_authentication_plugin = mysql_native_password 只影响新创建的用户,对已存在的 root、appuser 等完全无效。重启 MySQL 后,新建用户才走新插件。
- 云服务(RDS/CDB)通常屏蔽该配置项,
SHOW VARIABLES LIKE 'default_authentication_plugin'仍显示caching_sha2_password - Docker 启动加
--default-authentication-plugin=mysql_native_password同样不修复存量用户 -
default_authentication_plugin设成mysql_native_password后,仍需手动ALTER USER才能覆盖老用户
驱动和连接参数不配齐,切了插件也白搭
即使服务端已切回 mysql_native_password,PHP 应用仍可能卡在握手阶段,因为扩展版本或 DSN 缺关键参数。
- 确认
pdo_mysql或mysqli已启用:php -m | grep pdo_mysql,没输出就得开extension=pdo_mysql并重启 Web 服务 - 用
mysqli连接时,别只传三个参数:new mysqli("127.0.0.1", "root", "pass", "db"),要显式指定端口和字符集:new mysqli("127.0.0.1", "root", "pass", "db", 3306, "/tmp/mysql.sock") - PDO 连接串必须带
charset=utf8mb4,MySQL 8.0 默认排序规则是utf8mb4_0900_ai_ci,用utf8会触发警告甚至插入失败 - ThinkPHP 6+ 必须把配置里
'type' => 'mysql'改成'type' => 'pdo_mysql',否则报Driver [mysql] not supported
真正容易被忽略的是:改完认证插件后,PHP 进程没重启、客户端没清缓存、host 和 user 的组合没全覆盖——这三个点漏一个,问题照旧。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











