當php 5.5以上 遇上 mysql 5.2 時,連接mysql的指令 mysqli_connect() 會產生錯誤mysqli_connect(): 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').
: s4 {+ u" i0 r9 x
% C7 Y5 S: A# ^+ g這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.
/ Y2 X% V* f8 N1 H! e先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)6 V) h$ r6 p# V+ o
登入mysql 然後輸入 : 0 K! O$ X( v, w3 v" |7 ? l
mysql> SHOW VARIABLES LIKE 'old_passwords';
* U1 Y, o% B8 `% x4 I9 I+------------------+-------+
' {0 [7 p/ R& p3 d+ ^| Variable_name | Value |" G/ e$ [8 r7 q& |
+------------------+-------+
6 x) i+ N& g7 W' _* ]| old_passwords | ON |
D7 T' W3 o5 O+------------------+-------+2 y* w7 F) n8 i7 N4 s
1 row in set (0.00 sec)
) z" v5 `* K! L/ z6 z
$ ^3 z1 r3 B! d2 v# jold_password ==> ON 就表示 /etc/my.cnf 裏的 old_passwords=1 設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
+ `! }' d+ b; g. Q+ a' |0 y5 [2 P q9 V或 在 mysql prompt下輸入:
* Q8 u; r3 j$ E0 Omysql> SET old_passwords=FALSE; ! m1 j/ O2 M% @' y
檢查mysql.user內 每個密碼長度:3 M5 q: e T* [6 A* i/ n
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
& C& o) p, [) |1 m2 @$ W& e. x如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
/ l; f( l" v* X9 c @2 j- Z8 S7 ?! {* J% Z5 s3 d* r
再重設原來的密碼:: Q' h9 g1 P/ o
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼'); // 小心要核對原來 帳號@IP 更改,不要改錯了$ s$ |5 A ]# ^6 }
mysql> flush privileges;: [" B& [: u. V% O: x# K. S
3 D$ Q9 ~ v$ H: a再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼: Z! R) S$ T- A/ F1 ~% t% R6 G
注意:
' j8 ]3 m% @6 D: ?# R1 C3 E, V* b" P如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響===========================================================================# o/ {6 D8 b6 _0 Z6 Z' \8 U
當mysql升級到 8.0.21時,php連到mysql出現2行errors:
0 w$ C( D: B# Umysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers4 j6 u5 P* W: F; D
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers5 T0 ?8 A; Q! l
原因:
# [6 b0 z p$ D. z" G在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:6 F8 Q9 B8 W, N$ W- e$ F; P2 u
vi /etc/my.cnf 加入下列:
8 |2 b2 ^8 G9 P2 @! v8 d[mysqld]* ^7 Q: O* P' l
" O- g" V; b: Icharacter-set-server=utf8* ]% N/ w4 u5 l) b7 Y+ K
default_authentication_plugin=mysql_native_password
: O- W# Z& n* H# s e, G% d/ }7 ~2 {1 p& l
[mysql]# @' `2 O5 B% |; V
default-character-set=utf84 Q f2 F9 ]" a3 z# A* r
. t6 _9 w1 P- n. [5 m[client]
& x+ I. `5 t" `( |default-character-set=utf8
) i) ? M$ K- J" a
$ h( ?; w1 q( }9 p然後重啟mysqld
% X3 t8 r+ J8 j$ E% {service mysqld restart7 p: Q. O2 |+ ^, v, d$ W" n# [% Z
搞定!!+ ~$ y7 n; \3 w5 G9 K F5 ^$ X3 O
3 B! l8 Y z4 E" R& x, r5 o2 [; Y0 _# {3 \7 l4 w
|
|