PHP连接phpEnv的MySQL 8.0报错,因默认caching_sha2_password插件不被旧版PHP驱动支持;需执行ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'pwd'并FLUSH PRIVILEGES。

phpEnv 默认安装的 MySQL 8.0 会启用 caching_sha2_password 作为默认认证插件,而 phpEnv 自带的 PHP(尤其是旧版 PHP 7.4 或未更新扩展的 PHP 8.0)所用的 mysqlnd 驱动,默认不支持该插件——这直接导致 PDO/MySQLi 连接时抛出 Authentication plugin 'caching_sha2_password' cannot be loaded 或 Client does not support authentication protocol 错误。
确认当前用户认证插件是否为 caching_sha2_password
先连进 MySQL 命令行(phpEnv 控制面板里点「MySQL 终端」或手动执行 phpenv\mysql\bin\mysql -u root -p),运行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
如果结果中 plugin 列显示为 caching_sha2_password,且你用的是 PHP 7.4 / 8.0(非最新小版本)或未启用 RSA 密钥交换支持,基本就是它了。注意:phpEnv 的 MySQL 默认绑定 127.0.0.1,所以查 'root'@'127.0.0.1' 比 'root'@'localhost' 更准确。
改用户认证插件(最常用、见效最快)
对 phpEnv 这类本地开发环境,改单个用户比改全局配置更安全、影响更小。执行以下命令(替换你的用户名和密码):
需要创建、读取、编辑或处理 Word 文档(.docx / .dotx)时使用。触发词:'Word'、'word 文档'、'.docx'、'生成报告'、'制作合同/简历/方案/说明书'、'提取 word 内容'、'在文档里查找替换'、'给文档加页眉页脚/目录/表格'。也用于把任意内容排版成一份正式的 Word 文件。不要用它处理 PDF、Excel 或无关编程任务。中文创作场景尤其适合:小说大纲稿、投稿文档、合同、简历、工作总结。
ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_password';<br>FLUSH PRIVILEGES;
- 必须指定
'root'@'127.0.0.1',而不是'root'@'localhost'—— phpEnv 的 PHP 连接默认走 TCP,不是 socket - 如果报错
ERROR 1396 (HY000),说明该用户不存在,先查清实际 host:SELECT user, host FROM mysql.user; - 改完后重启 phpEnv 的 MySQL 服务(控制面板点「重启 MySQL」),否则部分连接可能仍缓存旧状态
PHP 连接时加参数(不改 MySQL,但需代码配合)
如果你不想动数据库配置(比如想保留新插件的安全性),可在 PHP 连接字符串中显式启用兼容模式。MySQLi 和 PDO 均需添加两个关键参数:
- PDO 连接示例:
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test;charset=utf8mb4;useSSL=false;allowPublicKeyRetrieval=true', $user, $pass); - MySQLi 连接示例:
$mysqli = new mysqli('127.0.0.1', $user, $pass, 'test', 3306, null, MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT | MYSQLI_CLIENT_SSL_ALLOW_PUBLIC_KEY_RETRIEVAL); -
allowPublicKeyRetrieval=true是关键,它允许客户端在caching_sha2_password认证流程中向服务器请求 RSA 公钥 -
useSSL=false仅限本地开发;生产环境务必配好 SSL 并设为true
为什么不能直接改 my.cnf 的 default_authentication_plugin?
phpEnv 的 MySQL 配置文件(通常在 phpenv\mysql\my.ini)里加 default_authentication_plugin=mysql_native_password 看似一劳永逸,但有隐患:
- 该设置只影响**新建用户**,已存在的 root 用户不会自动变更认证方式,仍需手动
ALTER USER - phpEnv 启动脚本有时会忽略自定义
my.ini,尤其使用绿色版或便携模式时 - 某些 phpEnv 版本内置 MySQL 是预编译二进制包,硬编码了插件加载路径,改配置未必生效
- 最麻烦的是:一旦你后续升级 phpEnv 或重装 MySQL,
my.ini可能被覆盖,问题复现
真正容易被忽略的是 host 匹配细节——'root'@'localhost' 和 'root'@'127.0.0.1' 在 MySQL 里是两个完全不同的用户,而 phpEnv 的 PHP 几乎总是走 127.0.0.1,这点不确认清楚,改一百遍插件也没用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










