必须指定完整'user'@'host'执行ALTER USER并FLUSH PRIVILEGES,因'localhost'与'127.0.0.1'是不同用户;ThinkPHP需显式配置charset='utf8mb4',且PHP须≥7.4.4并搭配支持caching_sha2_password的mysqlnd驱动。

ALTER USER 必须指定 host,不能只改用户
报错 Authentication plugin 'caching_sha2_password' cannot be loaded 时,很多人执行 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; 却没生效——因为你的 PHP 实际连接的是 'root'@'127.0.0.1'(TCP 方式),而 'localhost' 在 MySQL 中默认走 socket,两者是不同用户记录。
正确做法是先查清真实 host:
- 运行
SELECT user, host FROM mysql.user WHERE user = 'your_user'; - 常见开发环境 host 是
'127.0.0.1'(XAMPP、phpEnv)、'%'(远程授权)或'localhost'(本地 socket) - 必须用完全匹配的
'user'@'host'执行 ALTER,例如:ALTER USER 'app_user'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'pwd'; - 执行后立刻跟
FLUSH PRIVILEGES;,否则权限表不刷新
ThinkPHP 的 charset 配置必须为 utf8mb4
即使认证插件改对了,仍可能报 SQLSTATE[HY000] [2054] Server sent charset unknown to the client——这不是认证问题,是字符集协商失败。
MySQL 8.0 默认字符集是 utf8mb4,但 ThinkPHP 5.x 的 config/database.php 中若留空 'charset' 或写成 'utf8',PDO 初始化时无法正确识别服务端协议。
立即学习“PHP免费学习笔记(深入)”;
- 确认配置项:在
config/database.php中显式设为'charset' => 'utf8mb4' - 不要写
'utf8':MySQL 的utf8实际是utf8mb3,不兼容 emoji 和部分生僻字,且与 8.0 握手逻辑冲突 - DSN 中加
;charset=utf8mb4是冗余动作,ThinkPHP 会自动拼接,但配置项没设对就白搭
PDO 连接前不能靠 ATTR_EMULATE_PREPARES 补救
有人在 database.php 里加 'params' => [PDO::ATTR_EMULATE_PREPARES => true] 想绕过认证错误,这完全无效。
原因很直接:认证发生在 TCP 连接建立后的第一帧握手阶段,此时连 PDO 对象都还没创建成功,更别说设置属性了。
-
PDO::ATTR_EMULATE_PREPARES只影响预处理语句是否由 PHP 模拟执行,和认证协议无关 - 所有“连接失败”类报错,如
Client does not support authentication protocol,都卡在 MySQL 发起 challenge 后客户端不认识插件,直接断连 - 这类错误必须在 MySQL 侧改用户插件,或升级 PHP+mysqlnd 底层支持,代码层无解
PHP 版本和 mysqlnd 客户端库版本要双重验证
别只看 php -v 显示 7.4+ 就以为万事大吉。MySQL 8.0 的 caching_sha2_password 支持依赖两个条件同时满足:
- PHP ≥ 7.4.4(不是 7.4.0)
- 底层 mysqlnd 编译时链接的是 MySQL 8.0+ 的 client library(如
libmysqlclient 8.0.x或mysqlnd 8.0+) - Linux 下查:运行
php -i | grep "Client API version",输出应含8.0.;Windows 用户基本只能换新版 PHP 包 - 宝塔、AMH 等面板默认 PHP 往往仍用旧版 mysqlnd,即使 PHP 版本达标,也需手动编译或切换运行环境
真正容易被忽略的是:MySQL 用户插件和 PHP 客户端能力是两套独立机制,但报错现象几乎一样。先 fix 插件,再验 charset,最后才轮到查 PHP 底层——顺序错了,排查半天还在原地打转。



















