解决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:
如果不能升级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.cnf
或 my.ini
),将默认的身份验证插件改为 mysql_native_password
:
在 my.cnf
或 my.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();
}
解决方案总结
- 更新PHP和MySQL驱动:升级到支持
caching_sha2_password
的PHP版本。 - 修改用户身份验证方法:将用户改为使用
mysql_native_password
。 - 修改MySQL配置文件:调整默认身份验证插件。
- 检查PHP扩展:确保使用mysqlnd并升级到最新版本。
- PDO配置:使用正确的配置和连接参数。
通过以上步骤,大多数在PHP7+PDO+MySQL8环境下遇到的“SQLSTATE[HY000] [2054]”问题都可以得到解决。无论是修改用户身份验证方法还是更新PHP环境,选择最适合您环境的解决方案都能有效解决此问题。希望这篇博客能帮助您顺利连接并使用MySQL数据库!
版权声明:本文为原创文章,版权归 全栈开发技术博客 所有。
本文链接:https://www.lvtao.net/dev/php-pdo-mysql8-sqlstate-hy000-2054.html
转载时须注明出处及本声明