使用旧authentication无法连接到MySQL 4.1+

我试图连接到MySQL数据库在http://bluesql.net ,但是当我尝试连接,它给出了这个错误:

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

我已经研究过这个,它和MySQL 4.1之前使用的一些旧的密码scheme有关。 新版本可以select使用旧密码,我读过的密码可能会导致这个问题。

我正在运行PHP 5.3,并与mySQLi(新mysqli(…))连接。 我希望我可以在代码中执行一些操作,以便在bluesql.net连接到数据库 – 显然,我不能控制数据库的设置方式。 降级php版本不是一个选项。

任何人有任何想法?

编辑:这只适用于如果你在控制MySQL服务器…如果你不看看MySQL的密码哈希方法旧vs新

首先检查SQL查询

 SHOW VARIABLES LIKE 'old_passwords' 

(在MySQL命令行客户端中, HeidiSQL或任何你喜欢的前端)默认情况下服务器是否设置为使用旧的密码模式。 如果这返回的是old_passwords,Off那么您恰好在user表中有旧的密码条目。 MySQL服务器将使用这些帐户的旧authentication例程。 您可以简单地设置帐户的新密码,并使用新的例程。

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

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

对于使用旧密码的账户,这将返回16 ,对于使用新密码的账户,这将返回41 (对于根本没有密码的账户,则返回0,您也可以考虑这些)。
或者使用MySQL前端的用户pipe理工具(如果有的话)或者

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

(用您从上一个查询中获得的值replaceUserHost )。然后再次检查密码的长度。 现在应该是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

如果你没有控制服务器

我刚刚有这个问题,并能够解决它。

首先,用不介意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); 

这让我连接成功。

编辑:根据加兰教皇的评论,可能没有必要手动设置CLIENT_LONG_PASSWORD从PHP 5.4的PHP代码!

编辑: Antonio Bonifati ,一个为您运行查询的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"; ?> 

你可以在你的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; 

注意:你的用户名和密码

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

在OSX上,当连接到我的站点数据库时,我使用MacPorts来解决同样的问题。 Siteground似乎正在使用5.0.77mm0.1日志,但创build一个新的用户帐户没有解决问题。 这是做什么

 sudo port install php5-mysql -mysqlnd +mysql5 

这降级了PHP将使用的MySQL驱动程序。

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

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

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

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

2)将PHP降级到5.2.2,直到出现选项1。

从我所能find的问题来看,问题似乎是如何存储MySQL帐户密码,以及“old_passwords”设置是否设置为true。 这会导致MySQL和较新版本的PHP(5.3+)之间的兼容性问题,PHP尝试使用41个字符的哈希连接,但MySQL服务器仍使用16个字符的哈希来存储帐户密码。

这种不兼容性是由于MySQL 4.1中使用的散列方法的改变而产生的,它允许短和长散列长度(本页面的scheme2来自MySQL站点: http : //dev.mysql.com/doc/refman/ 5.5 / en / password-hashing.html ),并在PHP 5.3中包含了MySQL本地驱动程序(PHP向后兼容性问题logging在本​​文的第7项PHP文档中: http : //www.php.net/manual/en /migration53.incompatible.php )。

如果,

  1. 您正在使用共享主机,并且没有root权限。
  2. 你连接到远程数据库,即:不是本地主机时,得到说的错误。
  3. 和你使用Xamppp。
  4. 并且代码在运行服务器上运行良好,但是问题只发生在运行xampp的开发机器上。

然后,

强烈build议您安装xampp 1.7.0 。 下载链接

注意:这不是解决上述问题的办法,而是一个可以让你继续开发的FIX。