解决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

相关文章

Memcached如何配置分布式使用 并附PHP示例

Memcached是一种高性能的分布式内存对象缓存系统,广泛用于加速动态Web应用程序。通过将数据存储在内存中,Memcached能够显著减少数据库负载,提高应用的响应速度Memcached分布...

使用PHP打造轻量级单文件SQLite数据库管理工具

先声明一下,这是我自己内网使用的一个简单的管理工具,所以安全性方面我肯定是没有测试的~ 如果你要放在公网,请添加相关的权限认证及sql防注入等处理在开发过程中,我们经常需要一个简单易用的数据库管...

PHP 中的 declare 指令

在 PHP 编程中,declare 指令是一个强大的工具,用于控制代码的执行行为。它不仅可以启用严格类型模式,还可以用于其他一些高级功能,如性能监控和字符编码。本文将深入探讨 declare 指...

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

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

图片Base64编码

CSR生成

图片无损放大

图片占位符

Excel拆分文件