phpEnv 下连不上 MySQL 8.0 的根本原因是其捆绑的 PHP 7.x(如 7.2–7.4)所含 mysqlnd 驱动不支持 caching_sha2_password 认证插件,导致握手失败;即使修改 my.ini 也无效,因 root 用户已预设该插件,须执行 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码'; 并 FLUSH PRIVILEGES; 同时注意 127.0.0.1 地址需单独处理,且务必彻底重启 mysqld 进程(任务管理器杀进程后重启)。

phpEnv 自带的 MySQL 8.0 默认用 caching_sha2_password,但它的 PHP(尤其是旧版 phpEnv 集成的 PHP 7.x)默认不带 mysqlnd 对该插件的支持,所以 mysqli/pdo_mysql 连接直接报错——不是配置问题,是驱动缺能力。
为什么 phpEnv 下连不上 MySQL 8.0?
phpEnv 是 Windows 下的集成环境,多数版本捆绑的是 PHP 7.2–7.4 + MySQL 8.0,但其内置的 php_mysqli.dll 和 php_pdo_mysql.dll 编译时未启用完整认证协议支持。即使你改了用户插件,只要 PHP 进程没加载正确的客户端库,mysqli_connect() 或 PDO::__construct() 仍会卡在握手阶段,报错类似:Authentication plugin 'caching_sha2_password' cannot be loaded 或直接连接超时。
- 不是 MySQL 服务端配置错了,是 PHP 扩展“不认识”这个插件
- phpEnv 的
my.ini里加default_authentication_plugin=mysql_native_password没用——它只影响新创建的用户,而 phpEnv 初始化时已建好 root 用户,且插件仍是caching_sha2_password - Windows 下 PHP 不走系统 libmysqlclient,而是依赖自带的 mysqlnd,而旧版 mysqlnd 不支持 caching_sha2_password
快速修复:改用户认证插件(最稳)
登录 phpEnv 自带的 MySQL 命令行(通常在 phpEnv 安装目录下的 MySQL\bin\mysql.exe),用 root 连上后执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';<br>FLUSH PRIVILEGES;
- 必须写全
'root'@'localhost',不能只写'root',否则报错ERROR 1396 (HY000) - 如果你用
127.0.0.1连(比如某些 PHP 脚本里 host 写的是127.0.0.1),还要额外执行:ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY '你的密码'; -
FLUSH PRIVILEGES;必须执行,phpEnv 的 MySQL 版本(多为 8.0.2x–8.0.3x)不自动重载权限表
PHP 层绕过:强制指定认证插件(备用)
如果不想动数据库用户(比如多人共用 phpEnv),可在 PHP 连接时显式声明插件。仅适用于 mysqli(PDO 不支持):
立即学习“PHP免费学习笔记(深入)”;
$mysqli = new mysqli('127.0.0.1', 'root', '密码', '', 3306);<br>$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);<br>// 关键:手动指定插件<br>$mysqli->options(MYSQLI_OPT_READ_TIMEOUT, 5);<br>$mysqli->options(MYSQLI_OPT_WRITE_TIMEOUT, 5);<br>$mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, false);<br>// ⚠️ 注意:以下这行只在 PHP 7.4+ 且 mysqlnd ≥ 8.0.0 有效<br>$mysqli->options(MYSQLI_OPT_AUTH_PLUGIN_NAME, 'mysql_native_password');
- 此方法依赖 PHP 版本和 mysqlnd 实际能力,phpEnv 默认 PHP 7.3 往往不生效,别白试
- pdo_mysql 完全不支持
MYSQLI_OPT_AUTH_PLUGIN_NAME这类选项,PDO 连接只能靠改用户或升级 - 若提示
Unknown option MYSQLI_OPT_AUTH_PLUGIN_NAME,说明当前 mysqlnd 版本太低,直接放弃这条路
终极兼容方案:换 PHP 版本或补驱动
phpEnv 支持切换 PHP 版本。真正想一劳永逸,推荐:
- 升到 phpEnv 内置的 PHP 8.0+(如 8.0.30、8.1.25),这些版本的 mysqlnd 原生支持
caching_sha2_password,无需降级插件 - 或者手动替换
php/ext/php_mysqli.dll:从官方 PHP 8.1 x64 Thread Safe 包里提取对应 DLL,覆盖 phpEnv 中的旧文件(注意线程安全模式匹配) - 不建议改全局
my.ini的default_authentication_plugin:phpEnv 的 MySQL 重启不灵,且改完不影响已有用户,徒增维护负担
实际中最容易被忽略的一点:phpEnv 界面里点「重启 MySQL」经常只是 reload 配置,并不会真正重启 mysqld 进程,导致 FLUSH PRIVILEGES; 后仍连不上——遇到死连,务必关掉 phpEnv 控制面板,进任务管理器杀掉所有 mysqld.exe,再重新启动。



















