13

我正在尝试从本地计算机在线远程连接到 MySQL 服务器,但出现以下错误:

Warning: PDO::__construct(): The server requested authentication 
method unknown to the client [mysql_old_password] in 
C:\xampp\htdocs\ticket\terminal\sync.php

SQLSTATE[HY000] [2054] The server requested authentication method 
umknown to the client

我的本地 MySQL 服务器版本是 5.5.27,libmysql - mysqlnd 5.0.10 远程 MySQL 服务器版本是 5.5.23,mysqlnd 版本没有暴露。

我猜这是一个不兼容的密码哈希问题,但我不知道如何解决它。以下是我的连接代码的一部分

$dsn = 'mysql:host=184.173.209.193;dbname=my_db_name';
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
); 

try {
    $online_dbh = new PDO($dsn, 'myusername', 'mypassword', $options);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Congratulations!";
} catch (PDOException $e) {
    echo $e->getMessage();
} 
4

8 回答 8

13

假设您使用的是 PHP 5.3+,您可能会遇到向后不兼容性更改之一:

新的 mysqlnd 库需要使用 MySQL 4.1 更新的 41 字节密码格式。继续使用旧的 16 字节密码将导致 mysql_connect() 和类似函数发出错误,“mysqlnd cannot connect to MySQL 4.1+ using old authentication。”

如果是这样,请参阅https://stackoverflow.com/a/1340538/187954以获取有关更新密码的信息。

于 2013-01-30T20:41:19.450 回答
5

这可能会帮助解决此问题的人。这就是我在我的情况下修复它的方法。来自MySQL PHP API (PDO_MYSQL)网站

当运行 7.1.16 之前的 PHP 版本或 7.2.4 之前的 PHP 7.2 时,将 MySQL 8 Server 的默认密码插件设置为 mysql_native_password 否则您将看到类似于 The server requested authentication method unknown to the client [caching_sha2_password] even when caching_sha2_password未使用。

这是因为 MySQL 8 默认使用caching_sha2_password,这是一个旧 PHP (mysqlnd) 版本无法识别的插件。相反,通过在 my.cnf 中设置 default_authentication_plugin=mysql_native_password 来更改它。未来的 PHP 版本将支持caching_sha2_password 插件。与此同时,mysql_xdevapi扩展确实支持它。

于 2018-05-24T10:04:51.270 回答
3

我克服了挑战。我发现我的远程 MySQL 数据库主机仍然使用 16 字节的旧 MySQL 密码散列,而我的 localhost 数据库服务器使用 41 字节的密码散列。我使用以下查询来查找密码长度:

SELECT PASSWORD('mypass') 

我通过运行以下查询将 localhost 数据库服务器密码哈希更改为 16 字节

SET GLOBAL old_passwords = 1;

然后我编辑了my.ini文件,并设置了old_password=1确保当服务器重新启动时,它不会恢复到新的密码系统。但这并没有解决我的问题。

我发现是 PHP 处理了身份验证,因为我使用的是PHP's MySQL API,所以我降级到PHP 5.2.8并且能够成功建立远程连接。

我希望这可以帮助别人。

于 2013-03-10T09:59:42.317 回答
3

用 'password' 更改用 mysql_native_password 标识的用户 'username'@'localhost';会修复它。

于 2018-11-13T19:23:54.217 回答
2

我遇到了同样的问题,发现问题确实与 PHP 有关。

解决方案对我来说很简单:切换到 mysqli 而不是 PDO。使用 Zend_Db 时,这就像更改 1 行一样简单:

$db = Zend_Db::factory('pdo_mysql',array('host' => MYSQL_HOST, 'username' => MYSQL_USER, 'password' => MYSQL_PASS, 'dbname' => MYSQL_SCHEMA));

变成

$db = Zend_Db::factory('mysqli',array('host' => MYSQL_HOST, 'username' => MYSQL_USER, 'password' => MYSQL_PASS, 'dbname' => MYSQL_SCHEMA));

但是如果您的应用程序没有使用 Zend_Db 抽象(或任何其他)层,您可能会遇到麻烦。

于 2014-09-09T08:11:10.827 回答
1

我在共享托管服务(bluehost.com)上遇到了这个问题。我只是通过 Bluehost 提供的 Web 界面重置了 borking MySql 用户的密码。我重新使用了旧密码,在界面重新输入并保存,一切都很好。

于 2017-09-14T10:40:28.343 回答
0

如果您使用Bitbucket Pipelinesand MySQL 5.8+,您可以像这样将已知参数添加--default-authentication-plugin=mysql_native_password到您的服务中:

definitions:
  services:
    mysql:
      image: mysql:8.0
      environment:
        MYSQL_DATABASE: 'app'
        MYSQL_ROOT_PASSWORD: 'root'
        MYSQL_DEFAULT_AUTH: 'mysql_native_password'
于 2021-04-29T23:39:07.880 回答
-1

我在使用 laravel 5.6 和默认 mysql 数据库(设置为服务:)运行 bitbucket 管道时遇到了这个问题。

解决方案是使用旧版本的 mysql

definitions:
  services:
    mysql:
     image: mysql:5.6

PS:它是 PHP 7.1

于 2018-05-02T03:59:50.607 回答