SQLSTATE [HY000] [2000] mysqlnd无法使用旧的不安全身份验证连接到MySQL 4.1+

[错误代码]
SQLSTATE[HY000] [2000] mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD(‘your_existing_password’). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file

[错误代码] 
SQLSTATE [HY000] [2000] mysqlnd无法使用旧的不安全身份验证连接到MySQL 4.1+。请使用管理工具通过命令SET PASSWORD = PASSWORD(’your_existing_password’)重置密码。这将在mysql.user中存储一个新的,更安全的哈希值。如果此用户在PHP 5.2或更早版本执行的其他脚本中使用,则可能需要从my.cnf文件中删除old-passwords标志。

第一篇:PHP5.3开始使用MySqlND作为默认的MySql访问驱动,而且从这个版本开始将不再支持使用旧的用户接口链接Mysql了,

你可能会看到类似的提示:

#2000 – mysqlnd cannot connect to MySQL 4.1+ using old authentication

解决问题的方法不是调整PHP,而是检查你的Mysql,你需要确保两件事:

你使用的Mysql是4.1+以上版本,4.1以前的版本只支持使用老的16位密码存储

你准备用于连接的数据库帐号使用的MySql的新密码格式(41位的数据)

解决问题2的方法是重新设置账户的密码,并确保使用的标准Password()函数设置账户密码,相关指令如下:

— 选择系统库USE `mysql`– 显示当前的用户和密码,注意新的的密码格式应该是41位的加密字符,老的是16位的SELECT `user`,`password` from `user`;– 更新指定的用户的密码,注意使用函数 password()– 有时针对一些特殊需要,你可以使用old_password()函数来建立一个或几个向下兼容的数据库账户UPDATE `user` SET `password`=password(‘newpassword’) WHERE `user`=’UserName’;– 刷新MySql权限库FLUSH PRIVILEGES;– 最后别忘记了,MySql的命令行连接方式是:MySql -u username@host -p password 第二篇:最近开发环境升级到了 php 5.3.2, 链接 remote mysql 却发生了错误:connection failed:SQLSTATE[HY000] [2000] mysqlnd cannot connect to MySQL 4.1+ using old authenticationremote 的 mysql db my.cnf:

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

# Default to using old password format for compatibility withmysql 3.x

# clients (those using the mysqlclient10 compatibilitypackage).

old_passwords=1

是采用兼容格式的密码,而 php5.3的php_mysql; php_pdo_mysql采用的是增强的密码,所以导致两者不匹配,最方便的方式还是更新db的设置,取消 old_passwords

然后在 mysql.mysql.user,更新所有用户的密码, 如:

update user set password=PASSWORD(‘new password’) where user=’thisuser’;

flush privileges;

即可

不过更新my.cnf 需要重新启动 mysql ,对于应用中的服务器,不是必要就千万别更新php客户端了,哈哈

第三篇:

新的mysqlnd库需要使用MySQL 4.1新的41-byte的密码格式

使用旧的16字节的密码将导致mysql_connect()和类似的函数产生一个错误:mysqlnd cannotconnect to MySQL 4.1+ using old authentication.(mysqlnd不能用旧的验证方式来连接到MySQL 4.1以上的版本)

解决方法

这个比较变态 研究了好久 最后发现问题出在 my.cnf

1居然配置了old-password=1或者是old_password=1(把这一句注释掉)

2去掉之后 使用 set password for‘root’@’localhost’ = password(‘xxx’)

为root生成了新的41位密码 问题解决

 第四篇:官方的說法是

MySQL 4.1 and up uses an authentication protocol based on apassword hashing algorithm that is incompatible with that used byolder clients. …..

如果你升級mysql到4.1以上版本后遇到以上問題,請先確定你的mysql client 是4.1或者更高版本.

請使用以下2種方法之一

其一: (使用AppServ在修改mysql密碼時要使用下列方法才行)

mysql> SET PASSWORD FOR

   ->’some_user’@’some_host’ = OLD_PASSWORD(‘newpwd’);

其二:

mysql> UPDATE mysql.user SET Password =OLD_PASSWORD(‘newpwd’)

   -> WHERE Host =’some_host’ AND User = ‘some_user’;

mysql> FLUSH PRIVILEGES;

上面some_user, some_host, newpwd是要自己填入的

  • 删除或注释my.cnf中的old_passwords = 1

重新启动MySQL。如果你不这样做,MySQL将继续使用旧的密码格式,这意味着你不能使用内置的PASSWORD()哈希函数来升级密码。

旧密码散列值为16个字符,新密码散列值为41个字符。

  • 连接到数据库,并运行以下查询:SELECT用户,长度(密码 )FROM mysql 。用户;

这将显示哪些密码是旧格式,例如:

 
 + ------ + -------------------- + 
 |用户|长度(`Password`)| 
 + ---------- + -------------------- + 
 | root | 41 | 
 | root | 16 | 
 | user2 | 16 | 
 | user2 | 16 | 
 + ---------- + -------------------- +

请注意,每个用户可以有多行(每个不同的主机规范一个)。

要更新每个用户的密码,请运行以下命令:

  UPDATE mysql.user SET Password = PASSWORD('password')WHERE user ='username';

最后,刷新权限:

  FLUSH PRIVILEGES;

Source