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

B T*_*B T 69 php mysql authentication connection

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

Connect Error (2000) mysqlnd cannot connect to MySQL 4.1+ using old authentication
Run Code Online (Sandbox Code Playgroud)

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

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

有人有主意吗?

Vol*_*erK 72

编辑:这仅适用于您控制MySQL服务器...如果您不看看Mysql密码哈希方法旧与新

首先检查SQL查询

SHOW VARIABLES LIKE 'old_passwords'
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT `User`, `Host`, Length(`Password`) FROM mysql.user
Run Code Online (Sandbox Code Playgroud)

对于具有旧密码的帐户,这将返回16 ; 对于具有新密码的帐户,将返回41(对于没有密码的帐户,这将返回0,您可能也想要照顾这些密码).
使用MySQL前端的用户管理工具(如果有的话)或

SET PASSWORD FOR 'User'@'Host'=PASSWORD('yourpassword');
FLUSH Privileges;
Run Code Online (Sandbox Code Playgroud)

(替换User以及Host从上一个查询中获得的值.)然后再次检查密码的长度.现在它应该是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

  • 很好的答案.我需要做`SET old_passwords = 0;`让这个工作起作用,取自Elliot Yap的答案. (4认同)
  • 我做了上述所有步骤,但仍然获得16密码我已经更改. (3认同)

Teh*_*ike 65

如果您无法控制服务器

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

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

运行以下查询:

SET SESSION old_passwords=FALSE;
SET PASSWORD = PASSWORD('[your password]');
Run Code Online (Sandbox Code Playgroud)

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

define('CLIENT_LONG_PASSWORD', 1);
mysql_connect('[your server]', '[your username]', '[your password]', false, CLIENT_LONG_PASSWORD);
Run Code Online (Sandbox Code Playgroud)

这使我成功连接.

编辑:根据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"; 
?>
Run Code Online (Sandbox Code Playgroud)

  • 我只需要执行两个SET语句来修复我的(PHP 5.4,MySQL 5.0).PHP代码不需要更改:$ this-> dbh = mysql_connect(DB_HOST,DB_USER,DB_PASSWD); (3认同)
  • 肯定对我有用。PHP 5.3,MySQL 4.1 (2认同)

Ell*_*Yap 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;
Run Code Online (Sandbox Code Playgroud)

注意:您的用户名和密码

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


Cha*_*ers 7

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

sudo port install php5-mysql -mysqlnd +mysql5
Run Code Online (Sandbox Code Playgroud)

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