代码说

code is poetry

代码说    
碎碎念:己所不欲勿施于人,己所欲亦勿施于人。  换一换

php版本升级后遇到"mysqlnd cannot connect to MySQL 4.1+ using old insecure authentication"的问题

作者:coderzheng 发布于:2015-6-4 1:01 Thursday 分类:mysql  阅读模式

最近在弄WordPress时,发现从前在php5.2.6中运行的mysql连接出问题了:

于是找到这篇文章:http://blog.mixu.net/2010/06/06/quick-tip-how-to-fix-mysqlnd-cannot-connect-to-mysql-4-1-using-old-authentication-onphp5-3/
继续给大家免费提供翻译服务:
最近在windows上升级php到5.3,然后碰到这个问题:
Warning: mysql_connect(): OK packet 6 bytes shorter than expected in ...
Warning: mysql_connect(): mysqlnd cannot connect to MySQL 4.1+ using old authentication in ...
我是在vmware中运行linux服务器做开发,因此服务器自带的mysql数据库是比较旧版本的。正如你看到的,核心的问题是mysql使用了旧的16位格式的hash密码,而这不被php5.3版本的新mysqlnd库支持。
我没能迅速在google里面找到好的解决方案,下面是我解决这个问题的方法(没有升级php和mysql),建议使用:
1. 修改mysql配置,不再使用旧的密码
似乎即使是mysql5.x版本仍然在使用旧的hash密码。你需要在my.cnf文件中修改这个配置(比如/etc/my.cnf):去掉下面这行的注释:
old_passwords = 1 重启mysq.如果你不这么做,msql仍然使用旧的密码格式,这表示你无法使用内建的PASSWORD()哈希函数更新密码。你可以运行下面的命令来做测试:
 SELECT Length(PASSWORD('xyz'));
+-------------------------+
| Length(PASSWORD('xyz')) |
+-------------------------+
|                      16 |
+-------------------------+
1 row in set (0.00 sec)
旧的密码是16位字符,新的是41位。
2. 将数据库中的所有的旧密码换成新的格式(41位)
连接数据库,运行下面的查询:
SELECT user,  Length(`Password`) FROM   `mysql`.`user`; 这会显示哪些密码是旧的格式,比如:
+----------+--------------------+
| user     | Length(`Password`) |
+----------+--------------------+
| root     |                 41 |
| root     |                 16 |
| user2    |                 16 |
| user2    |                 16 |
+----------+--------------------+
注意到这里,每个用户可以拥有多个行(每行对应不同的主机)。
为了给每个用户更新密码,运行下面的语句:
UPDATE mysql.user SET Password = PASSWORD('password') WHERE user = 'username'; 最后,刷新权限:
FLUSH PRIVILEGES;








******************************** (六一小朋友们)完(得开心不?) ****************************

标签: 疑难杂症

你可以发表评论、引用到你的网站或博客,或通过RSS 2.0订阅这个博客的所有文章。
上一篇: 侠之大者,为国为民  |  下一篇:wampserver下mysql无法启动日志中报Plugin 'FEDERATED' is disabled