PHP 8.2 连 MySQL 8.0 默认大概率失败,主因是 caching_sha2_password 认证插件与底层客户端库(如 mysqlnd 或 libmysqlclient)版本不匹配,需确认 Client API version ≥ 8.0.x 并显式配置 charset=utf8mb4 及禁用 SSL 校验,或临时改用户认证为 mysql_native_password。

PHP 8.2 连 MySQL 8.0 默认大概率失败,不是代码写错了,而是 MySQL 8.0 的 caching_sha2_password 认证插件和 PHP 8.2 的 pdo_mysql 扩展之间存在握手兼容性断层——即使版本数字看着匹配,实际驱动编译时链接的客户端库(mysqlnd 或 libmysqlclient)若低于 8.0,仍会卡在认证阶段。
确认 pdo_mysql 底层客户端版本是否真支持 MySQL 8.0
只看 php -v 或 phpinfo() 显示 “PDO Driver for MySQL” 是不够的。关键要看它用的是哪个客户端库及其版本:
- 运行
php -i | grep -A5 "pdo_mysql",找到Client API version行,必须是8.0.x或更高(如8.0.33);5.7.34就不支持caching_sha2_password - 如果显示的是
mysqlnd 7.4.33,说明用的是原生驱动,但得确认编译时是否启用了 SHA2 支持——CentOS 7 默认仓库的php-mysqlnd包常基于旧 client,需手动升级 - Ubuntu/Debian 用户可直接
sudo apt install php-mysql,它通常绑定新版mysqlnd;CentOS/RHEL 用户推荐启用 Remi 仓库后装php-mysqlnd
DSN 必须显式带 charset=utf8mb4 且禁用 SSL 校验
MySQL 8.0 默认字符集是 utf8mb4_0900_ai_ci,而 PDO 初始化时不传 charset 会导致连接使用 latin1 或 utf8(即 utf8mb3),后续插入 emoji 或中文可能报错或乱码;云数据库(如阿里云 RDS)还常强制 SSL,但 PHP 8.2 默认不提供证书路径,会静默失败。
- 正确 DSN 示例:
"mysql:host=localhost;port=3306;dbname=test;charset=utf8mb4" - 务必在
PDO构造函数第四个参数中关闭 SSL:[\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::MYSQL_ATTR_SSL_CA => null] - 不要依赖
SET NAMES utf8mb4替代 DSN 中的charset,PDO 连接建立前就该确定字符集 - 若用 127.0.0.1 替代 localhost,可绕过 Windows 下 MySQL 8.0+ 的命名管道协议冲突
Windows 下 phpEnv 或 XAMPP 环境要重检 DLL 和 php.ini 路径
phpEnv 每个 PHP 版本独立管理配置,常见错误是改了错的 php.ini,或扩展文件名不匹配。PHP 8.2 在 Windows 上默认用 php_pdo.dll 和 php_pdo_mysql.dll,不是 extension=pdo_mysql。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;
- 在 phpEnv 界面右键当前 PHP 版本 → “打开 php.ini”,确认
extension_dir指向正确的ext/目录,并且该目录下存在php_pdo_mysql.dll - 取消注释这两行:
extension=php_pdo.dll和extension=php_pdo_mysql.dll(注意 .dll 后缀) - 保存后必须点 phpEnv 界面的 “Restart PHP”,不能只重启 Apache/Nginx
- 验证:访问
phpinfo()页面,搜索PDO drivers应看到mysql,搜索pdo_mysql应显示 “enabled” 且 Client API ≥ 8.0
实在连不上?优先改 MySQL 用户认证方式
开发/测试环境最稳最快的解法不是调 PHP,而是让 MySQL 降级认证插件。PHP 8.2 的 pdo_mysql 即使支持 caching_sha2_password,也高度依赖 OpenSSL 和完整握手流程,稍有缺失就报 Authentication plugin 'caching_sha2_password' cannot be loaded。
- 登录 MySQL 8.0:
mysql -u root -p - 执行:
ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 立即刷新:
FLUSH PRIVILEGES; - 检查生效:
SELECT user,host,plugin FROM mysql.user WHERE user='your_user';—— plugin 列应为mysql_native_password - 注意:若用户 host 是
%或具体 IP,需对应修改;root@localhost 可能用auth_socket,不可直接 ALTER,先建新用户再授权
真正麻烦的从来不是“能不能连”,而是“连上之后行为是否一致”——比如事务隔离级别、时间类型精度、JSON 字段处理,这些在 MySQL 8.0 + PHP 8.2 组合下都可能因驱动版本或配置疏漏产生隐性偏差。动手前先查 Client API version,比反复改 DSN 有效得多。


















