2012-06-08

PHP連接MySQL出現Password問題

當PHP連接MySQL如果出現以下訊息:

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

有可能是PHP使用新版連線方式,而MySQL帳號密碼編碼是使用舊版Hash方式,長度只有16(新版是41),導致Hash值不對所以無法登入。



可用底下SQL來檢查所有帳號密碼的長度:
SELECT user, Length(Password) FROM mysql.user;


應該可看到類似底下的表格

+----------+--------------------+
| user     | Length(`Password`) |
+----------+--------------------+
| root     |                 41 |
| root     |                 16 |
| user2    |                 16 |
| user2    |                 16 |
+----------+--------------------+

長度41就是新編碼方式,16就是舊方式,所以我們必須將需要變更的帳號的密碼編碼方式做改變,方法很簡單,執行底下SQL就好了:
UPDATE mysql.user SET Password = PASSWORD('原有密碼') WHERE user = '要修改的帳號名稱';


修改完成之後再用前面的SQL看一下長度是否已經改變了,改變的話就重新載入權限:
FLUSH PRIVILEGES;