php mysqli_connect:客户端未知的身份验证方法[缓存\u sha2\u密码]

php mysqli_connect:客户端未知的身份验证方法[缓存\u sha2\u密码],php,mysql,hash,sha,Php,Mysql,Hash,Sha,我正在使用phpmysqli\u connect登录MySQL数据库(全部在本地主机上) 使用MySQL服务器ini文件中的缓存\u sha2\u密码,根本不可能使用user1或user2登录 错误:mysqli_connect():服务器请求的身份验证方法对客户端未知[缓存\u sha2\u密码] 使用mysql服务器ini文件中的mysql\u native\u password,可以使用user1登录,但是使用user2时,同样的错误 如何在mySql服务器上使用缓存\u sha2\u密

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

使用MySQL服务器ini文件中的
缓存\u sha2\u密码
,根本不可能使用user1或user2登录

错误:mysqli_connect():服务器请求的身份验证方法对客户端未知[缓存\u sha2\u密码]

使用mysql服务器ini文件中的
mysql\u native\u password
,可以使用user1登录,但是使用user2时,同样的错误



如何在mySql服务器上使用
缓存\u sha2\u密码登录?

从PHP 7.4开始,这不再是一个问题。mysqlnd中添加了对
缓存\u sha2
身份验证方法的支持。


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

查看MySQL开发人员的相关帖子:


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

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

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

如果您正在创建新用户

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

这对我有用

ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';
ALTER USER
之后删除引号('),并在
mysql\u native\u密码之后保留引号(')

它也对我有用。

它对我有用(PHP5.6+PDO/MySQL服务器8.0/Windows7 64位)

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

default_authentication_plugin=mysql_native_password
在Windows上重置MySQL服务,并在MySQL外壳中

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

我运行了以下命令
ALTER USER'root'@'localhost'由'root123'用mysql_native_密码标识,最后在本地服务中重新启动MySQL。

如果您在Windows上,并且根本无法使用
缓存\u sha2\u密码
,则可以执行以下操作:

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

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

    我在Ubuntu 18.04中尝试过这一点 这是唯一对我有效的解决方案:

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

    我认为在没有缓存密码加密的情况下配置mysql服务器是没有用的,我们必须找到一种通过网络发布、发送或获取安全信息的方法。正如您在下面的代码中看到的,我不使用变量$db\u 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);
    }
    
    ?>
    

    如果您使用的是Mac电脑,下面介绍如何修复它。这是经过无数次尝试和错误后得出的结论。希望这对其他人有所帮助

    调试:

    $mysql --verbose --help | grep my.cnf
    
    $ which mysql
    /usr/local/bin/mysql
    
    决议: nano/usr/local/etc/my.cnf

    添加:默认身份验证插件=mysql\u本机\u密码

    -------
    # 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重新启动mysql

    与许多人一样,我也遇到了同样的问题。虽然用户设置为使用mysql\u native\u密码,并且我可以从命令行进行连接,但让mysqli()连接的唯一方法是添加

    默认身份验证插件=mysql\u本机\u密码

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

    到[mysqld]第节,在我的ubuntu 19.10安装程序中,/etc/mysql/mysql.conf.d/mysqld.cnf

    现在你可以升级到PHP7.4,mysql将默认使用
    缓存\u sha2\u密码
    ,因此默认的mysql安装将使用
    mysqli\u 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
    

    PDO支持这一点吗?我看过其他关于
    mysqli
    的报告@黃皓哲 应该标记为接受答案。使用以下命令从终端登录到mysql:mysql-u root-p,然后输入root密码,然后粘贴以下命令ALTER USER'root'@'localhost',通过'root'标识为mysql_native_密码;回答正确。这里的问题是,每次添加新用户时,您可能都必须这样做,具体取决于服务器版本设置非常感谢我一直在寻找将新密码哈希转换为旧密码哈希的方法(如问题中的user2格式转换为user1格式)你的答案完全正确,因此结束了4天的努力,让php-7.2.9/11与MySQL-8.012配合得很好。php团队中有人能在tarball中的安装中注意到这一点吗?这将在未来一两年内节省数千人时。@MountainMan救了我的命这应该是解决问题的公认答案olutionPDO@Machavity你知道这个答案是否仍然有效吗?也就是说,在更新的PHP版本中它还没有过时吗?@gen基于,看起来它从7.4.2升级到php7.4就解决了这个问题。我认为这是最好的方法,而不是像s建议的那样将身份验证方法更改为
    mysql\u native\u password
    我使用docker(在一个容器中使用apache+php,在另一个容器中使用mysql)这就解决了我的问题。谢谢!另外,请记住,如果用户是在这次更改之前创建的,那么它将不起作用。因此,您应该首先在配置中设置默认身份验证,然后创建用户才能工作!这在Ubuntu20.04上用MySQL 8.0和PHP5.6实现了。请注意,对于这项工作,您必须将表设置为INNODB,这也是唯一的y解决方案在本地主机服务器上使用WAMP服务器对我有效:)这似乎可以在我Mac的自制LAMP设置上修复它
    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