无法使用旧身份验证连接到MySQL 4.1+

时间:2009-10-16 00:16:22

标签: php mysql authentication connection

我正在尝试连接到http://bluesql.net的mySQL数据库,但是当我尝试连接时,它会出现此错误:

Connect Error (2000) mysqlnd cannot connect to MySQL 4.1+ using old authentication

我已经研究过了,它与MySQL 4.1之前使用的一些旧密码方案有关。较新的版本可以选择使用旧密码,我读过这些密码可能会导致此问题。

我正在运行php 5.3,并连接mySQLi(新的mysqli(...))。我希望我能在代码中做一些事情来连接到bluesql.net上的数据库 - 显然我无法控制他们的数据库是如何设置的。降级php版本不是一种选择。

有人有什么想法吗?

7 个答案:

答案 0 :(得分:70)

编辑:这仅适用于您控制MySQL服务器...如果您不查看Mysql password hashing method old vs new

首先检查SQL查询

SHOW VARIABLES LIKE 'old_passwords'

(在MySQL命令行客户端,HeidiSQL或您喜欢的任何前端)服务器是否设置为默认使用旧密码模式。如果返回old_passwords,Off,您恰好在user表中有旧密码条目。 MySQL服务器将为这些帐户使用旧的身份验证例程。您只需为帐户设置新密码,即可使用新例程。

您可以通过查看mysql.user表(使用可访问该表的帐户)来检查将使用的例程

SELECT `User`, `Host`, Length(`Password`) FROM mysql.user

对于具有旧密码的帐户,这将返回 16 ;对于具有新密码的帐户,这将返回 41 (对于没有密码的帐户,将返回0,您可能需要注意那些) 使用MySQL前端的用户管理工具(如果有)或

SET PASSWORD FOR 'User'@'Host'=PASSWORD('yourpassword');
FLUSH Privileges;

(将UserHost替换为您从上一个查询中获得的值。)然后再次检查密码的长度。它应该是 41 ,你的客户端(例如mysqlnd)应该能够连接到服务器。

另见MySQL文档: * http://dev.mysql.com/doc/refman/5.0/en/old-client.html
* http://dev.mysql.com/doc/refman/5.0/en/password-hashing.html
* http://dev.mysql.com/doc/refman/5.0/en/set-password.html

答案 1 :(得分:62)

如果你控制服务器

我刚遇到这个问题,并且能够解决这个问题。

首先,使用不介意old_passwords的旧客户端连接到MySQL数据库。使用脚本将使用的用户进行连接。

运行以下查询:

SET SESSION old_passwords=FALSE;
SET PASSWORD = PASSWORD('[your password]');

在PHP脚本中,更改mysql_connect函数以包含客户端标志1:

define('CLIENT_LONG_PASSWORD', 1);
mysql_connect('[your server]', '[your username]', '[your password]', false, CLIENT_LONG_PASSWORD);

这使我能够成功连接。

根据{{​​3}}的评论

编辑:,从PHP 5.4开始,可能没有必要在PHP代码中再次手动设置CLIENT_LONG_PASSWORD!

编辑:Garland Pope提供,这是一个为您运行查询的PHP脚本:

<?php const DB = [ 'host' => '...', # localhost may not work on some hosting 
    'user' => '...',
    'pwd' => '...', ]; 

if (!mysql_connect(DB['host'], DB['user'], DB['pwd'])) {
    die(mysql_error());
} if (!mysql_query($query = 'SET SESSION old_passwords=FALSE')) {
    die($query);
} if (!mysql_query($query = "SET PASSWORD = PASSWORD('" . DB['pwd'] . "')")) {
    die($query);
}

echo "Excellent, mysqli will now work"; 
?>

答案 2 :(得分:9)

你可以在你的mysql查询浏览器上做这些行

SET old_passwords = 0;
UPDATE mysql.user SET Password = PASSWORD('testpass') WHERE User = 'testuser' limit 1;
SELECT LENGTH(Password) FROM mysql.user WHERE User = 'testuser';
FLUSH PRIVILEGES;

注意:您的用户名和密码

之后它应该能够工作。我也解决了我的问题

答案 3 :(得分:7)

在OSX上,我使用MacPorts在连接到我的siteground数据库时解决了同样的问题。 Siteground似乎使用5.0.77mm0.1-log,但创建新用户帐户并未解决问题。这是做了什么

sudo port install php5-mysql -mysqlnd +mysql5

这降低了php将使用的mysql驱动程序。

答案 4 :(得分:2)

有同样的问题,但单独执行查询无济于事。为了解决这个问题,我做了以下工作,

  1. 在my.cnf文件中设置old_passwords = 0
  2. 重启mysql
  3. 以root用户身份登录mysql
  4. 执行FLUSH PRIVILEGES;

答案 5 :(得分:2)

如果您没有MySQL服务器配置的管理员访问权限(即您正在使用托管服务),那么有两个选项可以使其工作:

1)请求在MySQL服务器上将old_passwords选项设置为false

2)将PHP降级到5.2.2直到选项1发生。

从我能够找到的,问题似乎是如何存储MySQL帐户密码以及'old_passwords'设置是否设置为true。这导致MySQL和PHP的新版本(5.3+)之间存在兼容性问题,其中PHP尝试使用41个字符的哈希进行连接,但MySQL服务器仍然使用16个字符的哈希存储帐户密码。

这种不兼容性是由MySQL 4.1中使用的散列方法的改变引起的,它允许短和长散列长度(本页面的场景2来自MySQL站点:http://dev.mysql.com/doc/refman/5.5/en/password-hashing.html)并包含PHP 5.3中的MySQL本机驱动程序(本文子弹7中记录的PHP文档中的向后兼容性问题:http://www.php.net/manual/en/migration53.incompatible.php)。

答案 6 :(得分:0)

如果,

  1. 您正在使用共享主机,并且没有root访问权限。
  2. 连接到远程数据库时出现上述错误,即:not localhost。
  3. 和你使用的Xampp。
  4. 并且代码在实时服务器上正常运行,但问题仅出在运行xampp的开发计算机上。
  5. 然后,

    强烈推荐安装 xampp 1.7.0 Download Link

    注意:这不是上述问题的解决方案,而是一个允许您继续开发的FIX。