phpEnv连不上MySQL 8.0主因是其内置旧版MySQL客户端库不支持caching_sha2_password认证插件,导致握手失败并报错1251或1045;解决方式包括改用户认证方式、升级客户端库或修改MySQL配置启用mysql_native_password。

phpEnv 默认不兼容 MySQL 8.0 的 caching_sha2_password 认证方式,直接连接会报错 1251 或 1045 ——这不是 phpEnv 本身的问题,而是它内置的 PHP 扩展(如 mysqli、PDO_MySQL)调用的旧版 MySQL 客户端库(libmysqlclient)未启用对新插件的支持。
为什么 phpEnv 连不上 MySQL 8.0?
phpEnv 是 Windows 下的便携式 PHP 环境包,通常捆绑 MySQL 5.x 客户端头文件和静态链接库。即使你本地装了 MySQL 8.0 服务端,phpEnv 启动的 PHP 进程仍使用自带的旧客户端逻辑去握手,而该逻辑默认不识别 caching_sha2_password 握手流程,也不自动触发 allowPublicKeyRetrieval=true 类似机制。
典型表现:
- PHP 脚本执行
new mysqli()或PDO::__construct()时静默失败或抛出mysqli_connect(): The server requested authentication method unknown to the client - 错误日志里出现
Authentication plugin 'caching_sha2_password' cannot be loaded - phpinfo() 中显示
Client API version是5.7.x或更老
改用户认证插件(最快见效)
适用于开发调试环境,无需升级 phpEnv 或重编译 PHP 扩展。
立即学习“PHP免费学习笔记(深入)”;
在 MySQL 8.0 命令行中执行:
USE mysql; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;
注意点:
-
'root'@'localhost'和'root'@'%'是两个独立用户,必须分别修改 - 如果只改了
%却没改localhost,本地 PHP CLI 脚本仍可能连不上(因为默认走 socket,host 解析为localhost) - 改完后重启 phpEnv 的 Apache/Nginx 服务(不是 MySQL),让 PHP 进程重新加载连接逻辑
升级 phpEnv 内置的 MySQL 客户端(长期推荐)
新版 phpEnv(v3.0+)已替换为 MySQL 8.0 兼容的 mysqlnd 驱动,并启用 sha256_password 支持。但多数用户仍在用 v2.x 版本,此时可手动替换:
步骤如下:
- 下载与你的 phpEnv 架构匹配的
mysql-8.0.x-winx64.zip(从 dev.mysql.com 获取) - 解压后,将
lib/libmysql.dll替换到 phpEnv 的php/ext/php_mysqli.dll所在目录同级的lib文件夹下(路径类似:phpEnv\php\lib\libmysql.dll) - 确保
php.ini中启用了extension=mysqli和extension=pdo_mysql - 在连接字符串中显式加参数:
?charset=utf8mb4&allowPublicKeyRetrieval=true&useSSL=false
⚠️ 替换 DLL 后务必检查 PHP 是否能正常启动:运行 php -v,若报 php.exe - Entry Point Not Found,说明 DLL 版本不匹配,需退回原版。
绕过认证插件限制(仅限调试)
如果你无法登录 MySQL 服务端执行 SQL(比如只有 phpEnv 自带的 MySQL 实例),且该实例是 phpEnv 自建的 MySQL 8.0(非系统全局安装),可直接修改其配置文件禁用新插件:
编辑 phpEnv\MySQL\my.ini,在 [mysqld] 段落下添加:
default_authentication_plugin=mysql_native_password
然后重启 phpEnv 的 MySQL 服务。这样新创建的用户默认就用旧认证方式,避免后续新建用户再出问题。
这个设置不影响已有用户,只对 CREATE USER 生效;若已有用户仍是 caching_sha2_password,仍需用 ALTER USER 单独处理。
最常被忽略的是:phpEnv 的 MySQL 服务名通常不是 mysql,而是类似 phpenv-mysql,重启时得用对应服务名,否则改了配置也没用。



















