當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').& T+ v) f& V; r2 m/ S9 k
1 G3 N P; w/ a這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.# J: |4 K$ c/ P( e1 S& y; |! c; h2 i* j
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)% M0 }# c6 O' Z6 d( M# ^
登入mysql 然後輸入 :
# h; W* K1 ^7 p) F X. Tmysql> SHOW VARIABLES LIKE 'old_passwords';
; [( a: G- Q( i# R$ |2 {+------------------+-------+
7 L% Q* q7 s5 T) v) Y! m| Variable_name | Value |
( e. k! h0 N- g* w+------------------+-------+& \2 K' l/ X4 ]9 I1 N( |: D% F
| old_passwords | ON |* U: @; L; D3 @2 {
+------------------+-------+( f$ w. ]; V1 \- o# o5 ?
1 row in set (0.00 sec)
6 x) l3 _9 o0 M% a0 X# z7 }" W
9 j4 c0 t% d4 D1 P" d: d3 @4 ]6 Mold_password ==> ON 就表示 /etc/my.cnf 裏的 old_passwords=1 設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
/ s3 ~5 r/ H! u( L2 i8 C或 在 mysql prompt下輸入:
; d6 Y3 b1 h7 H4 p. |1 v |mysql> SET old_passwords=FALSE; # F4 ?- G6 |7 m( r3 H( N ~
檢查mysql.user內 每個密碼長度:% i! H, A3 A. T( o) z
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;0 s7 O3 Q' D- F8 f+ w( l: @3 x! L
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) 4 k9 A, K2 M' [$ o8 M
3 m( \! B$ Q9 Z) _5 n再重設原來的密碼:
" C: a9 G4 V0 g) {0 ~mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼'); // 小心要核對原來 帳號@IP 更改,不要改錯了
4 T, }* a- s) p; \mysql> flush privileges;
% A" @8 a6 S; |: n' ~) w2 X" `1 c/ x/ ^5 f3 P ?& o
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼" y: F; Y; e* o3 A+ G
注意:
. B2 f3 I- s/ U3 Q如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響===========================================================================
: l# K4 I' q% C% z當mysql升級到 8.0.21時,php連到mysql出現2行errors:2 C! G# L% R, v9 X' T5 a0 X
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
" P8 c% F* N X1 Z+ K- X& Imysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers, b# _! Y% ]5 _8 J4 W1 H
原因:
3 Y8 o; T4 Q- P* \7 r& ?$ @6 v在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
5 v" q) [9 R9 K- j0 [6 c& Qvi /etc/my.cnf 加入下列:
0 P7 t+ }7 E# g0 U[mysqld]. f+ k4 A- H) j6 b3 W" o4 T g
4 D6 W" m5 [9 ]character-set-server=utf86 i/ @) }$ i: B& s, p1 V" ?
default_authentication_plugin=mysql_native_password
* {0 H* _, W& ^) |( v) @9 z# O4 C0 D( L) ^
[mysql]& F* f! u% c# ?, w
default-character-set=utf8
+ ^/ a. F! J4 U- J0 ]1 c3 D& H+ C' r
q K) _3 i: _! V[client]( S1 P3 R; u( a R7 R2 ]
default-character-set=utf8: }, x. C. z8 T+ B- q6 L
. Y& n1 ^, V* i) L- G; O; E
然後重啟mysqld) ~* T4 C; Z6 _ O) _
service mysqld restart
, l( [" @: H0 y) v. @搞定!!
, x9 H3 ]. g4 R* { b Z: d# ?
/ U5 g" E1 {2 |8 h! F0 `1 B) ^
9 {3 o6 p9 r! d' b$ ^( { c G |
|