當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').3 |7 N6 x0 H( t3 z% ^8 g9 J/ ~& x
& t5 R7 @$ _: |這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.& k; ?1 a; m+ p) M7 d( k
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73): d) C7 K5 N/ c; N- v* d
登入mysql 然後輸入 : # {1 E5 J( T" _ p, O# Z7 ]
mysql> SHOW VARIABLES LIKE 'old_passwords';
/ C! a7 `& U' w8 b+------------------+-------+
- e1 ~, h% ?1 ]" S* x) ?4 V| Variable_name | Value |& _: l, t, H: h; K' _- F
+------------------+-------+
6 a2 N# J, L6 W, j, O+ v) R; Q| old_passwords | ON |* M7 A) q) W) Q+ F) _
+------------------+-------+
; c+ S. s7 o# C; i4 ~1 row in set (0.00 sec)$ N' y+ t/ ~' T. z
) j# l$ `+ w! B/ `! \# f3 Q! lold_password ==> ON 就表示 /etc/my.cnf 裏的 old_passwords=1 設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart% t: V \9 p3 D# x+ ~7 {
或 在 mysql prompt下輸入:
" d1 S# x1 n/ T# G. pmysql> SET old_passwords=FALSE; + D$ H; b2 X' n; R5 a
檢查mysql.user內 每個密碼長度:
0 ^1 v/ |9 c0 U! P0 ~" I8 Wmysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
& K" u+ Z8 C, r, p$ |如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
% g2 O9 t6 q7 g% m
2 D& Y2 j& w/ Q( M( q9 r; f9 q" K4 K再重設原來的密碼:' A5 Q2 W! a2 M% l( H X* }) r0 i
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼'); // 小心要核對原來 帳號@IP 更改,不要改錯了
9 W6 e. ~, Y5 P! Mmysql> flush privileges;
. z0 _% k" p7 x$ o
0 F3 ` H: K- F. E- H) v再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
0 k# d4 A* H/ R; l' s- ~5 ^3 y" Q注意:8 M1 O5 V& b( G7 E* H3 ?' x
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響===========================================================================& Y' y& g. E+ {6 V2 B0 p. W
當mysql升級到 8.0.21時,php連到mysql出現2行errors:% V) j: v3 y% B- U/ l: h0 Z7 r
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
e6 K. v: e) I; r' H3 Tmysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
7 D$ i5 z, A+ X) e# h3 `6 Q+ W原因:
% H3 u- k3 l I4 C/ I5 k- ~5 t在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
8 ]& j3 z) o+ Y' }! @' A& avi /etc/my.cnf 加入下列:; h# Q h: M i. { H6 `7 G
[mysqld]: v2 U) T1 Q* I7 a E
2 M- L+ J+ M7 o$ Pcharacter-set-server=utf8& s8 b. _0 Y7 ~8 f8 m: K& t
default_authentication_plugin=mysql_native_password N9 `0 H. @9 M; E* X
6 d; K- I% f5 }8 {: M[mysql]6 n1 e, X+ L( S" X; [
default-character-set=utf8
2 `' m1 z, M6 L- e% ^
0 a- @% `0 h% w5 w4 ^0 V: S" @, K[client]
, W& N8 X9 m2 ^# S% \1 G2 @. S0 hdefault-character-set=utf8' k; m y( b" E1 _
, W2 N8 g# \* S! ^% o
然後重啟mysqld
7 D/ ?3 v' G1 f v/ lservice mysqld restart* N& |+ o9 H! U) ?$ S* Z9 h( s p0 v
搞定!!
3 E. p' L) c2 H# a2 d" S3 i# S" w+ q6 \1 k/ y4 h( r% k. ^% z: i
) \) s$ Y4 x' x! m# [ |
|