php 7.4 连接 mysql 8.0 失败主因是 caching_sha2_password 认证插件不兼容,需将用户认证插件改为 mysql_native_password,并启用 mysqli/pdo_mysql 扩展、刷新权限、指定 utf8mb4 字符集及初始化命令。

PHP 7.4 在 phpEnv 环境下连不上 MySQL 8.0,90% 是 caching_sha2_password 认证插件不兼容导致的,不是配置路径或扩展没开——先查这个,再查别的。
确认 MySQL 用户当前用的是什么认证插件
MySQL 8.0 默认给新用户(包括 root)分配 caching_sha2_password,而 phpEnv 自带的 PHP 7.4(尤其 Windows 下的集成包)多数仍依赖旧版 libmysql 或未启用完整支持的 mysqlnd,压根不认识这个插件。
登录 MySQL 执行:
SELECT user, host, plugin FROM mysql.user;
如果看到 root 对应的 plugin 是 caching_sha2_password,那就坐实了问题根源。
- 别只改
localhost,顺手也查'root'@'%'—— phpEnv 里常通过 TCP 连(比如127.0.0.1),走的是%而非localhost - 执行完
ALTER USER后必须跟FLUSH PRIVILEGES;,否则不生效 - 改完立刻用命令行验证:
mysql -u root -p -h 127.0.0.1(注意用127.0.0.1而非localhost,避免走 socket 走偏)
phpEnv 中必须启用 mysqli 和 pdo_mysql 扩展
phpEnv 的 php.ini 文件通常位于 phpEnv\php\php74\php.ini(路径以你实际安装为准),光有扩展文件不够,得显式启用。
打开该文件,确保以下两行前面的分号已去掉:
;extension=mysqli ;extension=pdo_mysql
改为:
extension=mysqli extension=pdo_mysql
- 别只改
mysqli,PDO 用户也得开pdo_mysql,否则PDO::__construct()报错 - 改完必须重启 phpEnv 的 Apache/Nginx 服务(点面板上的“重启 Web 服务”按钮,不是只刷新页面)
- 写个
test.php丢进www目录,内容为<?php phpinfo(); ?>,浏览器访问,搜索mysqli和PDO,确认模块已加载
连接时强制指定字符集和初始化命令
即使认证通过,MySQL 8.0 默认的 utf8mb4_0900_ai_ci 排序规则可能让老版 mysqlnd 初始化失败,表现为连接成功但查字段乱码或 SET NAMES 不生效。
用 mysqli 连接时,不要只写:
$conn = new mysqli("127.0.0.1", "root", "pass", "db");
而要显式设置:
$conn = new mysqli("127.0.0.1", "root", "pass", "db");
$conn->set_charset("utf8mb4");
PDO 则在 DSN 后加参数,并传入初始化指令:
$dsn = "mysql:host=127.0.0.1;dbname=db;charset=utf8mb4";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"
];
$pdo = new PDO($dsn, "root", "pass", $options);
-
charset=utf8mb4必须带分号,写成charset=utf8mb4(不是utf8)且不能漏掉; - 仅 DSN 里写
charset不保险,PDO::MYSQL_ATTR_INIT_COMMAND是兜底关键 - phpEnv 的 PHP 7.4 一般自带
mysqlnd,但若你手动编译过或换过扩展,运行php -i | findstr "mysqlnd"(Windows)确认输出含mysqlnd => enabled
真正麻烦的不是改哪一行,而是 phpEnv 这类集成环境把 MySQL、PHP、Web 服务全打包在一起,出问题时你不知道是 MySQL 拒绝了、PHP 找不到扩展、还是连接后初始化就崩了。建议每改一项,就用最简代码单独验证:先连通,再查表,最后看中文是否正常——拆开看,比堆一起调快得多。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











