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

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

我正在使用 php mysqli_connect 登录 MySQL 数据库(全部在本地主机上)

<?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 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 文件中使用 caching_sha2_password,根本无法使用 user1 或 user2 登录;

error: mysqli_connect(): The server requested authentication method unknown to the client [caching_sha2_password] in...

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


如何在 mySql 服务器上使用 caching_sha2_password 登录?

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


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

检查来自 MySQL 开发人员的相关 post:https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

他们没有提到 PDO,也许你应该尝试连接 PDO。

我通过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

引用

这对我有用

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

删除 ALTER USER 后的引号 (') 并保留 mysql_native_password BY

后的引号 (')

它也对我有用。

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

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

default_authentication_plugin=mysql_native_password

在 Windows 重置 MySQL 服务,并在 MySQL Shell...

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

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

如果您使用 Windows 并且根本无法使用 caching_sha2_password,您可以执行以下操作:

  1. 重新运行 MySQL 安装程序
  2. select "Reconfigure" 在 MySQL 服务器旁边(最上面的项目)
  3. 单击 "Next" 直到到达 "Authentication Method"
  4. 将 "Use Strong Password Encryption for Authentication (RECOMMENDED)" 更改为“使用旧版身份验证方法(保留 MySQL 5.X 兼容性)
  5. 点击"Next"
  6. 在帐户和角色中输入您的 Root 帐户密码,然后单击 "Check"
  7. 点击"Next"
  8. 继续点击 "Next" 直到到达 "Apply Configuration"
  9. 点击"Execute"

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

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

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

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

<?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);
}

?>

如果您使用的是 Mac,请按以下方法解决问题。这是经过大量的反复试验。希望这对其他人有帮助..

调试中:

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

$ which mysql
/usr/local/bin/mysql

决议: 纳米 /usr/local/etc/my.cnf

添加:默认身份验证插件=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 服务重新启动mysql

和很多人一样,我也遇到过同样的问题。虽然用户设置为使用 mysql_native_password,并且我可以从命令行连接,但我可以让 mysqli() 连接的唯一方法是添加

default-authentication-plugin=mysql_native_password

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

现在您可以升级到 PHP7.4 并且 MySQL 将默认与 caching_sha2_password 一起使用,因此默认 MySQL 安装将与 mysqli_connect 一起使用无需配置。

我正在使用 laravel 5.8 并让 MAMP 服务器通过在 .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

在我使用 WAMP 服务器的情况下,我使用以下方法修复了它

  1. 记下 mySQL 的“my.ini”文件中的端口。在我的例子中,当我切换 b/w MariaDB 和 MySQL DB 时,它被更改为 3308

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

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

phpMyAdmin GUI 方式

注意:如果您的 root 用户帐户有问题,此方法可能无效。

  1. 以 root 身份登录 phpMyAdmin。
  2. 切换到“用户帐户”选项卡。
  3. Select 错误的用户名。
  4. 从顶部按钮切换到“登录信息”部分。
  5. 在“登录信息”框中,将“身份验证插件”从“缓存 sha2 身份验证”更改为“本机 MySQL 身份验证”。此外,您必须填写其他必填字段,显然,包括用户名和密码。
  6. 点击底部的“开始”按钮保存。
  7. Return 回到终端享受吧。 :)

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

paramers.yml 中的数据库凭据错误。

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