php8连接mysql报错“access denied”或“caching_sha2_password cannot be loaded”,主因是客户端mysqlnd驱动不支持该插件;需先查select user, host, plugin from mysql.user where user='your_username'确认插件类型,若为caching_sha2_password,则执行alter user 'your_username'@'localhost' identified with mysql_native_password by 'your_password'; flush privileges;解决。

PHP8连接MySQL数据库时提示“Access denied for user”或“Authentication plugin 'caching_sha2_password' cannot be loaded”,说明默认认证方式不兼容旧版MySQL客户端驱动。这通常发生在升级PHP到8.0+后,而MySQL服务端版本低于8.0.23,或使用了mysqlnd扩展但未启用对应认证插件。
确认MySQL服务端认证插件类型
登录MySQL服务器执行:SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
观察返回结果中plugin字段值。若为caching_sha2_password且PHP报错,说明客户端不支持该插件——PHP 8.0默认的mysqlnd 8.0.0+虽支持,但部分Linux发行版(如Ubuntu 20.04自带php-mysql)仍捆绑旧版mysqlnd,无法加载SHA-2密码验证模块。
方法一:修改用户认证插件为mysql_native_password
在MySQL中执行以下命令(需有SUPER权限):
ALTER USER 'your_username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
FLUSH PRIVILEGES;
【必须执行FLUSH PRIVILEGES,否则更改不生效】
方法二:强制PHP使用mysqlnd并启用caching_sha2_password支持
编辑php.ini,确认已启用mysqlnd扩展:
extension=mysqli
extension=pdo_mysql
检查mysqli.default_socket或pdo_mysql.default_socket路径是否指向正确的MySQL socket文件;若使用TCP连接,此步可跳过。
若仍报错,说明当前mysqlnd编译时未启用sha256_password支持。此时需重新编译PHP或升级系统PHP包至8.1+(Ubuntu 22.04+、CentOS Stream 9等已默认包含完整认证插件支持)。
方法三:连接时显式指定认证插件(PDO专用)
仅适用于PDO连接,且MySQL服务端版本≥8.0.13:
在DSN中添加&auth_plugin=mysql_native_password参数:
$pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4&auth_plugin=mysql_native_password', $user, $pass);
注意:此参数对mysqli扩展无效,mysqli不支持运行时切换认证插件。
验证连接是否修复
① 创建测试脚本test_db.php:
$mysqli = new mysqli('localhost', 'your_username', 'your_password', 'testdb');
if ($mysqli->connect_error) {
die('连接失败:' . $mysqli->connect_error);
}
echo '连接成功';
$mysqli->close();
?>
② 命令行执行:php test_db.php
③ 输出“连接成功”即表示问题已解决。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











