连接错误 (2054) - mysql_old_password 问题仍未解决

Mar*_*las 4 mysql php mysql-5.5

我使用 PHP 5.4.3,我想使用普通的面向对象编程 (OOP) 方式远程连接到 MySQL 数据库(为了简洁起见,DB)(PHP 脚本驻留在与 DB 不同的服务器上):

$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
Run Code Online (Sandbox Code Playgroud)

我收到错误:

警告:mysqli::mysqli():服务器请求客户端未知的身份验证方法 [mysql_old_password] 连接错误 (2054) 服务器请求客户端未知的身份验证方法

我找到了这个这个,但它们似乎没有帮助。我使用 PHP 5.2.9,一切正常,但降级 PHP 版本对我来说不是一个解决方案。

我还必须提到,我没有对数据库设置的完全访问权限,因为客户端没有给我这种访问权限。我告诉他向 Hostgator 请求更新的密码格式支持,但他们回答说他们不能做任何超出我预期的事情。我从另一台远程服务器做了一项新的努力,现在我得到了:

连接错误 (1045) 用户“用户”@“主机”的访问被拒绝(使用密码:YES)

使用 PHP 5.3.9。由于远程服务器的 PHP 脚本,数据库似乎没有“让我进入”,但使用 Oracle 的 Workbench 一切正常。

谢谢你的时间。

Rol*_*DBA 5

PHP 肯定希望使用旧的 MySQL 身份验证插件算法。您不必重新启动 mysql。由于old_passwords是全局动态选项,因此您所要做的就是运行以下命令:

SET GLOBAL old_passwords = 1;
Run Code Online (Sandbox Code Playgroud)

另外,请将其添加到/etc/my.cnf

[mysqld]
old_passwords=1
Run Code Online (Sandbox Code Playgroud)

以便将来重新启动时保留此设置。

为了进一步验证是否需要这样做,下次登录mysql时,运行这个

SELECT LENGTH(password) password_length,COUNT(1) length_count
FROM mysql.user GROUP BY LENGTH(password);
Run Code Online (Sandbox Code Playgroud)

如果没有一个密码长度为 16,这可能解释了 PHP 不愿登录的原因。

遗憾的是,另一种选择是设置 16 个字符的密码,但您无法对 41 个字符的密码进行逆向工程。您必须使用原始纯文本值手动设置 16 个字符的密码。

例如,如果 root@localhost 将“helloworld”作为密码,它将使用OLD_PASSWORD函数对其进行转换。这是一个比较:

mysql> select password('helloworld');
+-------------------------------------------+
| password('helloworld')                    |
+-------------------------------------------+
| *D35DB127DB631E6E27C6B75E8D376B04F64FAF83 |
+-------------------------------------------+
1 row in set (0.00 sec)

mysql> select old_password('helloworld');
+----------------------------+
| old_password('helloworld') |
+----------------------------+
| 6c755a9e66debe8a           |
+----------------------------+
1 row in set (0.00 sec)

mysql>
Run Code Online (Sandbox Code Playgroud)

一旦激活old_passwords,要转换它,您必须执行以下操作:

UPDATE mysql.user
SET password = OLD_PASSWORD('helloworld')
WHERE password = PASSWORD('helloworld');
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

更新 2013-02-02 22:44 美国东部时间

如果此时更改 MySQL 端的身份验证方式对您不起作用,那么我有一些坏消息要告诉您。您之前说过:

我使用 php 5.2.9,一切正常,但降低 php 对我来说不是一个解决方案。我还必须提到,我没有对数据库设置的完全访问权限,因为客户端没有给我完全访问权限。

毕竟您可能需要降级 PHP。如果您的托管提供商没有能力或不愿意调整 MySQL 或为您提供降级的 PHP,您将不得不选择愿意的托管提供商。

作为替代方案,当您可以在运行后完全控制所有软件升级时,您可能需要考虑 Amazon EC2 sudo -s。您之前提到的链接为您提供了您需要了解的信息。我向您介绍了如何适应 MySQL 方面。做你知道必须做的事情来解决这个问题。