解决PHP7+PDO+MySQL8环境中“SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client”问题

在使用PHP7及PDO与MySQL8连接数据库时,有时会出现以下错误提示:

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

发生这种错误,是由于MySQL 8默认使用了新的密码验证插件:caching_sha2_password,而之前的PHP版本中所带的mysqlnd无法支持这种验证。解决这个问题,有两种办法。

一种办法是升级PHP支持MySQL 8的新验证插件。

PHP 7.2.8和PHP 7.1.20已经可以支持caching_sha2_password,直接连接MySQL 8。

截止PHP 7.0.31和PHP 5.6.37还无法支持caching_sha2_password,不知道后续版本是否会做出支持。

可以通过phpinfo()函数了解当前安装的PHP是否支持caching_sha2_password:
548763-20181115135821615-1173384229.png

如果不能升级PHP,可以在MySQL 8中创建(或修改)使用caching_sha2_password插件的账户,使之使用mysql_native_password,这样先前版本的PHP就可以连接使用了。

MySQL 8+ 默认使用 caching_sha2_password 作为其身份验证方法,而PHP7中的PDO和一些较旧的mysqlnd驱动可能不支持这种新方法,导致无法建立连接。相较之下,mysql_native_password 是一种更老、更常用的方法,很多PHP版本都支持。

解决方案

针对这个问题,有多种解决方案可以考虑:

1. 更新PHP版本和MySQL驱动

确保PHP版本为7.4或更高,并且更新mysqlnd驱动以支持 caching_sha2_password。如果可以,请使用最新的PHP和驱动版本以确保兼容性。

2. 修改MySQL用户的身份验证方式【这是我的操作方法,直接将对应的账号的密码认证方式】

可以将MySQL用户的身份验证方法从 caching_sha2_password 改为 mysql_native_password,以确保与PHP兼容。具体步骤如下:

ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
FLUSH PRIVILEGES;

这条SQL命令将 your_user 的身份验证方式更改为 mysql_native_password,确保PDO可以正常连接。

3. 修改MySQL配置文件

可以通过修改MySQL配置文件(如 my.cnfmy.ini),将默认的身份验证插件改为 mysql_native_password

my.cnfmy.ini 中添加以下行:

default_authentication_plugin=mysql_native_password

保存文件后,重启MySQL服务:

sudo systemctl restart mysql

或使用以下命令(视系统不同):

service mysql restart
4. 检查和升级PHP扩展

确认使用的是PDO的mysqlnd驱动,并在需要时进行升级。可以通过以下命令检查已安装的PHP扩展:

php -m | grep mysql
5. 确保使用正确的PDO配置

在使用PDO连接MySQL时,确保代码正确配置,例如:

try {
    $dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8';
    $username = 'your_user';
    $password = 'your_password';
    $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false,
    ];
    $pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

解决方案总结

  1. 更新PHP和MySQL驱动:升级到支持 caching_sha2_password 的PHP版本。
  2. 修改用户身份验证方法:将用户改为使用 mysql_native_password
  3. 修改MySQL配置文件:调整默认身份验证插件。
  4. 检查PHP扩展:确保使用mysqlnd并升级到最新版本。
  5. PDO配置:使用正确的配置和连接参数。

通过以上步骤,大多数在PHP7+PDO+MySQL8环境下遇到的“SQLSTATE[HY000] [2054]”问题都可以得到解决。无论是修改用户身份验证方法还是更新PHP环境,选择最适合您环境的解决方案都能有效解决此问题。希望这篇博客能帮助您顺利连接并使用MySQL数据库!

标签: PHP, MySQL

相关文章

如何在PHP框架Workerman中实现异步任务处理

在现代Web应用中,处理繁重的业务逻辑时,避免主业务流程被长时间阻塞是非常重要的。Workerman是一个高性能的PHP Socket框架,支持异步任务处理,可以有效地解决这一问题。本文将详细介...

PHP中使用CURL下载远程超大文件的方法

在使用PHP进行开发时,我们经常需要从远程服务器下载文件。当文件体积较大时,普通的文件操作和cURL方法可能会因为内存限制或执行时间限制而失败。本文将介绍如何使用PHP中的cURL扩展来高效地下...

PHP命名空间使用详解

在 PHP 中,命名空间(Namespace)是一种将相关的类、函数和常量组织到一个逻辑分组中的方式。它有助于避免命名冲突,并提高代码的可维护性和可扩展性。一、命名空间的定义使用 namespa...

复习一下PHP中的类和对象

面向对象编程(OOP)是一种编程范式,它通过类和对象的概念来组织代码。PHP 作为一种广泛使用的服务器端脚本语言,从 PHP 5 开始就全面支持面向对象编程。本文将深入探讨 PHP 中类和对象的...

图片Base64编码

CSR生成

图片无损放大

图片占位符

Excel拆分文件