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


69

我正在尝试连接到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版本不是一种选择。

谁有想法?


3
@Hill,很抱歉您有这样的感觉:(。但是,如果不是开放源代码,我们基本上仍会生活在穴居人时代。没有一个开源项目是完美的(当然,除了我的项目;),但是在在很多情况下,开放源代码软件库比封闭源代码更值得信赖。对于最终用户软件,这肯定是不同的
BT

Answers:


72

编辑:仅在您控制MySQL服务器时才适用...如果您不看看Mysql密码哈希方法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/zh-CN/old-client.html
* http://dev.mysql.com/doc/refman/5.0/zh-CN/password -hashing.html
* http://dev.mysql.com/doc/refman/5.0/en/set-password.html


1
感谢您的详细回答。我能够连接gui客户端,并且old_passwords确实为“ ON”。我以为我在“设置old_password = OFF”时有一些东西,但是当我开始一个新会话时,它又重新打开了。
英国电信2009年

糟糕,我没有意识到您无法控制服务器(某种潜在的文本盲目性)。在那种情况下,我认为查尔斯是对的​​。或者...也许不是bluesql.net上的所有服务器都配置为使用短密码哈希。也许,如果您询问他们,您可以将其转移到另一台服务器。
VolkerK

4
好答案。我需要做SET old_passwords = 0;一些工作才能使它生效,摘录自下面的Elliot Yap的答案。
homerjam

3
我完成了上述所有步骤,但仍然更改了16的密码。
PHP Avenger

您必须SET old_passwords=0先准备好SET PASSWORD FOR 'user'@'host' = password('yourpassword');
Stack Underflow

65

如果您无法控制服务器

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

首先,使用不关心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);

这使我可以成功连接。

编辑:根据Garland Pope的评论,从PHP 5.4起,可能不需要在您的PHP代码中手动设置CLIENT_LONG_PASSWORD了!

编辑: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"; 
?>

3
我只需要执行两个SET语句即可解决我的问题(PHP 5.4,MySQL 5.0)。PHP代码无需更改:$ this-> dbh = mysql_connect(DB_HOST,DB_USER,DB_PASSWD);
Garland Pope

我想象没有[]对吗?SET SESSION old_passwords = FALSE; 设置密码=密码('mypass'); 代替SET SESSION old_passwords = FALSE; 设置密码=密码('[mypass]');
riahc3 2014年

也为我工作!,谢谢您,先生!
AaronP

如果您没有对该用户表的访问权限,那么这确实是最好的解决方案。
迈克尔(Michael)

我正在使用mysqli模块(PHP 5.6,MySQL 5.0),并且遇到相同的问题。我按照您的过程进行操作,但是我得到了同样的警告:使用phpmyadmin可以正确执行MySQL查询,但是使用mysqli模块找不到与PHP部分等效的查询。我能做什么?(如果重要的话,我的网站由aruba托管在Windows vm上...)谢谢:)
gior91

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;

注意:您的用户名和密码

之后,它应该可以工作。我也解决了我的问题


1
仅当您是数据库管理员或有权访问内部mysql数据库的人员时,此解决方案才有效。
TehShrike 2011年

7

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

sudo port install php5-mysql -mysqlnd +mysql5

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


如果您以后需要如何升级回最新版本?
戴维

在Windows方面也有任何建议吗?安装旧版本的PHP(独立或WAMP等)?我不认为可以像在Mac上那样在Windows上对PHP的mySQL驱动程序进行降级。
戴维

请注意,降级可能会将系统的参考路径更改为PHP。在降级之前,调用哪个php会显示/ usr / bin / php。降级后,它可能更改为/ opt / local / bin / php,可能是因为使用了MacPorts,而之前使用的是Mac系统默认的PHP。我的PHPUnit仍然在/ usr / bin / phpunit下。看起来我的PHP也已从5.x(Mac OS X 10.6上的默认设置)降级为2.3.0。但一个好处是,在降级后,我能够使用mysql connect。希望降级不会带来其他问题。
大卫(David

忽略我对PHP版本的评论。将Zend引擎版本误读为PHP版本。对我来说,/ usr / bin / php是5.3.4,/ opt / local / bin / php是5.3.12。
戴维

2

遇到相同的问题,但是仅执行查询将无济于事。为了解决这个问题,我做了以下工作,

  1. 在my.cnf文件中设置old_passwords = 0
  2. 重启mysql
  3. 以root用户登录mysql
  4. 执行冲洗特权;

仅当您是有权访问my.cnf文件的数据库管理员时,此解决方案才有效。
TehShrike 2011年

2

如果您没有对MySQL Server配置的管理员访问权限(即,您正在使用主机服务),则可以通过以下两种方法使它起作用:

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 / zh-CN / password-hashing.html),并在PHP 5.3中包含MySQL本机驱动程序(此向后兼容性问题,PHP文档的本页7记录在此文件中):http : //www.php.net/manual/zh-CN /migration53.incompatible.php)。


0

如果,

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

然后,

这是强烈建议您安装XAMPP 1.7.0下载链接

注意:这不是解决上述问题的方法,而是FIX,它将使您可以继续进行开发。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.