PHP mysqli_connect:客户端未知的身份验证方法 [caching_sha2_password]

php mysqli_connect: authentication method unknown to the client [caching_sha2_password]

提问人:Guti_Haz 提问时间:4/26/2018 最后编辑:MachavityGuti_Haz 更新时间:11/19/2023 访问量:309656

问:

我正在使用 php 登录 MySQL 数据库(全部在 localhost 上)mysqli_connect

<?php
//DEFINE ('DB_USER', 'user2');
//DEFINE ('DB_PASSWORD', 'pass2');
DEFINE ('DB_USER', 'user1');
DEFINE ('DB_PASSWORD', 'pass1');
DEFINE ('DB_HOST', '127.0.0.1');
DEFINE ('DB_NAME', 'dbname');

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if(!$dbc){
    die('error connecting to database');    
}
?>

这是 mysql.user 表:mysql.user table

MySQL 服务器 ini 文件:

[mysqld]
# The default authentication plugin to be used when connecting to the server
default_authentication_plugin=caching_sha2_password
#default_authentication_plugin=mysql_native_password

在MySQL服务器ini文件中,根本无法使用user1或user2登录;caching_sha2_password

错误:mysqli_connect():服务器请求的身份验证方法对客户端 [caching_sha2_password] 未知...

在MySQL服务器ini文件中,可以使用user1登录,但是使用user2登录,则出现相同的错误;mysql_native_password


如何在mySql Server上登录?caching_sha2_password

php mysql 哈希 sha

评论

0赞 tadman 4/26/2018
PDO是否支持此功能?我看过其他关于.mysqli
0赞 FIL 2/4/2019
@黃皓哲发布的答案应标记为已接受的答案。
0赞 user3512810 3/26/2021
使用此命令从终端登录到 mysql : mysql -u root -p 然后输入 root 密码,然后粘贴以下命令 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
0赞 Charles Wood 6/16/2022
对于从以下答案中没有运气的人:当我的 .env 文件中的数据库 IP 错误时,我也在 Laravel 应用程序中收到了此错误消息!

答:

96赞 abeyaz 4/26/2018 #1

从 PHP 7.4 开始,这不再是一个问题。对caching_sha2身份验证方法的支持已添加到 mysqlnd。


目前,PHP mysqli 扩展不支持新的caching_sha2身份验证功能。 您必须等到他们发布更新。

查看MySQL开发人员的相关帖子: https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

他们没有提到 PDO,也许您应该尝试与 PDO 联系。

评论

4赞 Machavity 6/18/2019
PDO也有同样的问题
1赞 Machavity 3/22/2020
@gen 根据此错误,看起来它从 7.4.2 开始工作
8赞 ultrasamad 6/22/2020
升级到 php7.4 确实解决了这个问题。我认为这是最好的方法,而不是按照一些答案的建议更改身份验证方法。mysql_native_password
1赞 Joan Galmés Riera 11/1/2020
我使用docker(容器中的apache + php,其他容器中的mysql),这解决了我的问题。谢谢!
1赞 RaminS 7/28/2021
PHP 7.4.3 在这里。必须更改才能使其工作。mysql_native_password
327赞 黃皓哲 6/10/2018 #2

我通过SQL命令解决了这个问题:

ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

https://dev.mysql.com/doc/refman/8.0/en/alter-user.html

如果要创建新用户

 CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

https://dev.mysql.com/doc/refman/8.0/en/create-user.html

这对我有用

评论

5赞 Machavity 6/28/2018
好答案。这里的问题是,每次添加新用户时,您可能需要执行此操作,具体取决于服务器设置
4赞 Accountant م 7/26/2018
非常感谢您,我一直在寻找一种将新密码哈希转换为旧密码哈希的方法(例如问题中的 user2 格式到 user1 格式),您的回答完全可以完成这项工作
19赞 MountainMan 10/13/2018
就这样结束了 4 天的斗争,让 php-7.2.9/11 与 MySQL-8.012 很好地配合。PHP团队中的某个人能否被说服在压缩包的INSTALL中注意到这一点?这将在未来一两年内节省数千个工时。
10赞 Yohanim 1/30/2019
这应该是解决方法的可接受答案
2赞 cgclip 7/26/2019
这在 CentOS 上的 php7.0 和 mysql 8.0 中对我有用,只要确保你也重新启动 mysqld
44赞 Eranda J. 1/9/2019 #3
ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

删除后面的引号 ('),并在后面保留引号 (')ALTER USERmysql_native_password BY

它也对我有用。

评论

4赞 Jodyshop 2/24/2020
这是使用 WAMP 服务器:)在 localhost 服务器上对我有用的唯一解决方案
0赞 Magnus 2/24/2020
这似乎在我的 Mac 的自制 LAMP 设置上修复了它。不过在 debian 上没有遇到这个问题。
1赞 Jason 2/26/2021
对于那些纯粹的初学者,1) 2) 3) 在这篇文章中输入代码行cd /usr/local/mysql/bin./mysql -u root -p
21赞 Chinnon Santos 5/4/2019 #4

它对我有用(PHP 5.6 + PDO / MySQL Server 8.0 / Windows 7 64位)

编辑文件:C:\ProgramData\MySQL\MySQL Server 8.0\my.ini

default_authentication_plugin=mysql_native_password

在 Windows 和 MySQL Shell 中重置 MySQL 服务...

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';

评论

0赞 danisupr4 5/16/2020
它有效,谢谢...我们必须配置两件事:MySQL conf 和 alter user
9赞 JRonald Moreno 5/24/2019 #5

我在命令行中运行了以下命令,最后在本地服务中重新启动MySQL。ALTER USER 'root' @ 'localhost' identified with mysql_native_password BY 'root123';

评论

2赞 d1jhoni1b 8/12/2020
此处不应读取任何空格'root' @ 'localhost'ALTER USER 'root'@'localhost' identified with mysql_native_password BY 'root123';
32赞 CJ Dennis 6/20/2019 #6

如果您使用的是 Windows,但根本无法使用,则可以执行以下操作:caching_sha2_password

  1. 重新运行MySQL安装程序
  2. 选择MySQL Server旁边的“重新配置”(顶部项目)
  3. 单击“下一步”,直到找到“身份验证方法”
  4. 将“使用强密码加密进行身份验证(推荐)”更改为“使用传统身份验证方法(保留MySQL 5.X兼容性)
  5. 点击“下一步”
  6. 在“帐户和角色”中输入您的 Root 帐户密码,然后单击“检查”
  7. 点击“下一步”
  8. 继续单击“下一步”,直到到达“应用配置”
  9. 点击“执行”

安装程序将为您进行所需的所有配置更改。

评论

2赞 Code Tree 9/26/2020
伙计,经过一年对这个答案投赞成票,我的数据库被黑了......
2赞 incredimike 7/28/2021
我怀疑这是你的数据库黑客攻击的根本原因。感谢您的帖子 OP,它帮助我为运行 PHP 5.6 的旧应用程序配置了 MySQL。
4赞 imjesr 9/9/2019 #7

我在 Ubuntu 18.04 中尝试过这个 并且是唯一对我有用的解决方案:

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';

评论

0赞 Ken Ingram 6/2/2022
完善。我正在测试。其他答案需要重新设计我的整个系统,该系统目前只为访问一个项目而工作。我想我需要一个轮换的“HOT”(始终更新)服务器。
-4赞 Steven Canales 10/10/2019 #8

我认为在没有caching_sha2_password加密的情况下配置mysql服务器是没有用的,我们必须找到一种方法通过网络发布,发送或获取安全信息。正如您在下面的代码中看到的,我不使用变量 $db_name,而我在 mysql 服务器中使用具有标准配置密码的用户。 只需创建一个 Standar 用户密码并配置所有权限即可。它有效,但我怎么说没有安全感。

<?php
$db_name="db";
$mysql_username="root";
$mysql_password="****";
$server_name="localhost";
$conn=mysqli_connect($server_name,$mysql_username,$mysql_password);

if ($conn) {
    echo "connetion success";
}
else{
    echo mysqli_error($conn);
}

?>
7赞 kp123 11/7/2019 #9

如果您使用的是 Mac,以下是修复方法。这是经过大量试验和错误之后的。希望这对其他人有所帮助。

调试:

$mysql --verbose --help | grep my.cnf

$ which mysql
/usr/local/bin/mysql

分辨率: 纳米 /usr/local/etc/my.cnf

添加:default-authentication-plugin=mysql_native_password

-------
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
default-authentication-plugin=mysql_native_password
------

最后运行:brew services restart mysql

评论

0赞 nykc 9/5/2020
需要这个...谢谢!
32赞 dBags 11/10/2019 #10

像许多人一样,我也遇到过同样的问题。尽管用户设置为使用 mysql_native_password,并且我可以从命令行进行连接,但我获得 mysqli() 连接的唯一方法是添加

默认身份验证插件=mysql_native_password

到[mysqld]部分,在Ubuntu 19.10的设置中,/etc/mysql/mysql.conf.d/mysqld.cnf

评论

3赞 Oleg Popov 11/22/2019
此外,请记住,如果用户是在此更改之前创建的,则该用户将不起作用。因此,您应该首先在配置中设置默认身份验证,然后创建用户才能工作!
1赞 rubo77 4/19/2021
这适用于带有 MySQL 8.0 和 PHP 5.6 的 Ubuntu 20.04。请注意,您必须将表设置为 INNODB 才能完成这项工作
1赞 Igor 1/28/2022
将其添加到配置后,我收到相同的错误
0赞 Raffi 8/14/2023
这对我适用于 Ubuntu 20.04.6 LTS(我必须编辑和运行)、MySQL 版本 8.0.33-0ubuntu0.20.04.4、PHP 5.6,我不需要重新创建用户。/etc/mysql/mysql.cnfsystemctl restart mysql.service
0赞 Hafiz Siddiq 9/6/2023
你节省了我的时间......在更改用户对 MySQL 本机密码的设置后,在 Ubuntu 20.04 上,我不得不将此行添加到 ,它就像一个魅力。谢谢/etc/mysql/mysql.conf.d/mysqld.cnf
5赞 Pavel Niedoba 11/11/2019 #11

现在您可以升级到 PHP7.4,默认情况下 MySQL 将随之使用,因此默认的 MySQL 安装无需配置即可。caching_sha2_passwordmysqli_connect

评论

2赞 Machavity 3/22/2020
差一点。它在 7.4.0 和 7.4.1 中存在错误。已在 7.4.2 中修复
0赞 Zeeshan Mehdi 4/22/2021 #12

我正在使用 laravel 5.8 并通过在 .env 文件中添加 DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock 来解决此错误,如下所示

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=dbname
DB_USERNAME=root
DB_PASSWORD=root
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
0赞 Harsh 8/24/2021 #13

就我而言,当我使用WAMP服务器时,我使用以下方法修复了它

  1. 请注意mySQL的“my.ini”文件中的端口。就我而言,当我切换黑白 MariaDB 和 MySQL DB 时,它被更改为 3308

enter image description here

  1. 在创建 mysqli 对象时使用端口号。

enter image description here

使用上述步骤,我能够成功运行该程序。

0赞 MAChitgarha 9/7/2021 #14

phpMyAdmin GUI方式

注意:如果您遇到 root 用户帐户的问题,此方法可能不起作用。

  1. 以 root 身份登录 phpMyAdmin。
  2. 切换到“用户帐户”选项卡。
  3. 选择您收到错误的用户名。
  4. 从顶部按钮,切换到“登录信息”部分。
  5. 在“登录信息”框中,将“身份验证插件”从“缓存 sha2 身份验证”更改为“原生 MySQL 身份验证”。此外,您必须填写其他必填字段,显然,包括用户名和密码。
  6. 通过单击底部的“开始”按钮保存它。
  7. 返回航站楼并享受。:)
0赞 sh6210 10/5/2021 #15

就我而言,我使用的是PHP框架,这是一个愚蠢的错误。Symfony

数据库凭据错误。paramers.yml

相应地更改凭据后,问题就消失了。

1赞 MiraTech 7/25/2022 #16

如果您尚未更改MySQL默认身份验证插件,可以通过以下方式进行更改:

  1. 登录MySQLroot
  2. 运行以下 SQL 命令:

a. 如果您在不同的服务器中运行 MySQL:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password
BY 'password'; 

b. 如果您在不同的服务器中运行MySQL:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password
BY 'password'; 
0赞 Usama Munir 12/10/2022 #17

在 Digital Ocean Managed Mysql 中,我们有一个更改加密的选项,您可以更改为旧版,它可以正常工作。

0赞 Ryan Arief 11/19/2023 #18

就我而言:

我正在使用 和 .由于默认身份验证并且还不支持它,因此我必须通过执行以下操作将 MYSQL 8 身份验证设置为:PHP 5.6MYSQL 8MYSQL 8caching_sha2_passwordPHP 5.6mysql_native_password

default-authentication-plugin=mysql_native_password 

到 Ubuntu 22.04 中配置文件行的末尾/etc/mysql/conf.d/mysql.cnf