phpmyadmin连接mysql 8.0成败关键在mysqli扩展启用与认证插件兼容:php 7.4需确保extension=mysqli已启用且mysql用户改用mysql_native_password插件,否则必报错。

phpMyAdmin 本身不依赖 PHP 版本,但连接 MySQL 8.0 的成败,90% 取决于 mysqli 扩展是否启用、MySQL 用户认证插件是否兼容——PHP 7.4 完全能用,前提是别跳过这两步。
确认 phpMyAdmin 正在用 PHP 7.4 的 mysqli 扩展
phpMyAdmin 是个纯 PHP 应用,它运行在哪版 PHP 上,就用哪版的扩展。很多人切了 PHP 版本却没检查扩展状态,一访问就报“mysqli extension missing”。
- 进宝塔或 phpstudy 面板,找到「PHP 7.4 设置」→「安装扩展」,确保
mysqli和pdo_mysql已勾选并显示“已安装” - 手动验证:在 PHP 7.4 的
php.ini文件里搜extension=mysqli,确认前面没分号;再查extension_dir指向的目录下是否存在mysqli.so(Linux)或php_mysqli.dll(Windows) - 执行
php -m | grep mysqli(终端),输出有mysqli才算真正加载成功
MySQL 8.0 用户必须改用 mysql_native_password 插件
MySQL 8.0 默认用 caching_sha2_password,而 PHP 7.4 的 mysqli 扩展(尤其非 mysqlnd 构建版)根本不认这个插件,连上去直接报 Authentication plugin 'caching_sha2_password' cannot be loaded。
- 登录 MySQL 8.0(用 root 或高权限账号):
mysql -u root -p - 执行:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 如果要批量修复所有用户(含 phpMyAdmin 自己用的账户),可运行:
SELECT CONCAT('ALTER USER ''',user,'''@''',host,''' IDENTIFIED WITH mysql_native_password BY ''',authentication_string,''';') FROM mysql.user WHERE plugin = 'caching_sha2_password';,再逐条执行结果 - 别忘了
FLUSH PRIVILEGES;
phpMyAdmin 配置里禁用 DEFINER 并设对 SQL_MODE
即使连上了,导入导出时仍可能因高版本语法失败。phpMyAdmin 默认导出会带 DEFINER 和 MySQL 8.0 特有注释,低配版 phpMyAdmin 或旧环境解析会卡住。
- 打开 phpMyAdmin 根目录下的
config.inc.php - 在对应服务器配置块中加两行:
$cfg['Servers'][$i]['DisableIS'] = true;(禁用 INFORMATION_SCHEMA 缓存干扰)、$cfg['SQLQuery']['DisableCRLF'] = true;(避免换行引发解析歧义) - 导出时务必在界面勾选「添加 SET SQL_MODE 语句」,并把「语法兼容性」设为
MYSQL40——这能压制 JSON、utf8mb4_0900_as_cs等 8.0 专属特性 - 若已导出失败的 SQL 文件,全局替换:
DEFINER=`[^`]+`@`[^`]+`→ 空;utf8mb4_0900_as_cs→utf8mb4_unicode_ci
别忽略 phpMyAdmin 自身的 MySQL 连接参数
phpMyAdmin 用的是自己的连接逻辑,不是复用 PHP-FPM 的全局配置。它可能绕过你设好的 default_authentication_plugin,必须显式指定。
- 在
config.inc.php的服务器配置段加入:$cfg['Servers'][$i]['connect_type'] = 'tcp';(避免 Unix socket 权限问题) - 加上:
$cfg['Servers'][$i]['ssl'] = false;(除非你真配了证书,否则 SSL 握手失败比认证失败还难排查) - 若 MySQL 8.0 启用了密码过期策略,加一行:
$cfg['Servers'][$i]['nopass'] = false;,强制每次校验密码 - 最后检查
$cfg['Servers'][$i]['host']填的是 IP 或域名,不是localhost(后者在部分系统会走 socket,触发插件识别异常)
最常被跳过的其实是 MySQL 用户 host 权限和 phpMyAdmin 的 DNS 解析行为——比如你用 127.0.0.1 连,但用户只授权了 'pma'@'localhost',或者容器内 DNS 不通导致 host 解析超时。这些点不摸到具体错误信息(比如 #1045 Access denied 后面跟的 host 是什么),光调配置没用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











