phpMyAdmin 5.x 认证失败源于 PHP 的 mysqli/PDO 扩展与 MySQL 认证插件不兼容,多服务器下无法动态切换协议;需为 MySQL 8.0+ 用户强制设为 mysql_native_password 并确保 PHP 使用支持该插件的 mysqlnd 驱动。
phpmyadmin 5.x 本身不“支持”或“不支持”某个认证插件——它完全依赖 php 的 mysqli 或 pdo 扩展与 mysql 通信,而这些扩展是否能处理 caching_sha2_password、ed25519 或 mysql_native_password,取决于php 版本 + 对应的 mysqlnd 驱动版本 + 编译时启用的特性。
所以问题本质不是 “phpMyAdmin 5.x 不支持旧插件”,而是:在多服务器配置下,不同 MySQL 实例可能混用认证方式(比如一个用 8.0 的 caching_sha2_password,另一个是 5.6 的 mysql_native_password),而 phpMyAdmin 共享同一套 PHP 连接逻辑,无法为每个服务器动态切换底层认证协议。
多服务器模式下认证失败的典型表现
登录页能显示服务器下拉列表,但选中某台后报错:mysqli_real_connect(): (HY000/2054): The server requested authentication method unknown to the client
这说明:
- 你配置了多个
$cfg['Servers'][$i] - 其中至少一台(通常是 MySQL 8.0+)用了
caching_sha2_password或ed25519 - 当前 PHP 环境(尤其是
mysqlnd驱动)没启用对应插件支持(例如 PHP 7.4 默认不带caching_sha2_password支持,PHP 8.0+ 才逐步完善)
为什么不能靠 phpMyAdmin 自动适配?
-
mysqli扩展在建立连接时,只根据服务器返回的初始握手包决定用哪种认证方式,不接受运行时指定插件名(不像命令行客户端可用--default-authentication-plugin) -
phpMyAdmin没有中间层去拦截、重写或协商认证流程;它只是把$cfg['Servers'][$i]['host']、user、password交给mysqli::real_connect() - 所以:只要有一台服务器要求
caching_sha2_password,而当前 PHP 不支持,整个连接就失败——哪怕其他服务器完全兼容
实操上怎么绕过这个限制?
- 对 MySQL 8.0+ 实例,单独建一个仅用于 phpMyAdmin 的用户,并强制降级认证:
ALTER USER 'pma80'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx';
- 确保该用户的
plugin字段确实是mysql_native_password(查SELECT plugin FROM mysql.user WHERE User='pma80';) - 不要给这个用户设
caching_sha2_password或ed25519,哪怕 MySQL 全局default-authentication-plugin是后者 - 同时确认 PHP 使用的是
mysqlnd而非libmysqlclient(phpinfo()查Client API library),因为后者对新插件支持更差
容易被忽略的一点
多服务器配置里,$cfg['Servers'][$i]['auth_type'] 设为 cookie 或 config 并不影响认证插件选择——它只控制 phpMyAdmin 怎么获取用户名密码,真正的认证协议协商发生在 mysqli 层,完全由 MySQL 服务端驱动和 PHP 扩展决定。
所以别指望改 auth_type 或升级 phpMyAdmin 版本就能解决;关键在:MySQL 用户插件 + PHP mysqlnd 版本 + 是否启用对应认证能力,三者必须对齐。



















