當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').' m x u! P8 w6 p
& d4 v" h& n6 M3 P這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.4 N+ D+ L0 Y) q; Z
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)9 b: p' J+ R8 k3 c: O8 j; s
登入mysql 然後輸入 : - F" g4 C- n+ l" L
mysql> SHOW VARIABLES LIKE 'old_passwords';
0 C/ x8 }2 T. {& M4 e8 ^1 W+------------------+-------+; U9 o2 l& V6 [/ D1 I: l
| Variable_name | Value |
( h) C9 t% O, [. i+------------------+-------+
0 [$ c8 ]1 K0 T9 S. \1 f8 c| old_passwords | ON |5 _4 K" v" A; f; b' R
+------------------+-------+7 c/ R4 J# v0 _' B8 Q& K
1 row in set (0.00 sec)
; e: u* k6 d2 W: D
. w1 P/ ^4 A! w' P' n. cold_password ==> ON 就表示 /etc/my.cnf 裏的 old_passwords=1 設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
8 O$ n& x* f) q- C$ K7 W5 D8 k- O或 在 mysql prompt下輸入:
. a) B$ t4 q6 l9 y' K4 C/ w" F& [mysql> SET old_passwords=FALSE;
0 n1 L9 y$ L a. y& r0 Q: _% p0 D檢查mysql.user內 每個密碼長度:
1 M$ L0 Y7 l% r s8 ]2 T' `, Vmysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
/ ^% H8 j7 v4 Z4 }3 n- B如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
8 O, b& U+ k6 J W- d# `6 S
+ [% p& h* c$ i8 K% h再重設原來的密碼:
8 i% T! v/ Q! u/ I3 mmysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼'); // 小心要核對原來 帳號@IP 更改,不要改錯了
' ^0 ]) ~& L. g% R# v8 amysql> flush privileges; d6 K7 {/ z! [0 b2 D. j5 F
/ e! k0 c5 ~! T再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
* w- ~8 i) f( W8 Y3 ] r注意:; h0 L* k7 ~6 u- s8 f' m
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響===========================================================================
( u0 C: Z( {/ |4 D5 ?當mysql升級到 8.0.21時,php連到mysql出現2行errors:, C$ r3 ~5 a3 }8 X/ i# y+ ~
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers0 J; e9 i5 C2 M/ h1 `# g
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
0 d# k! R" E* n原因:! O+ `: @3 H; [% l- Q
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:, f( ?* X' d" I" l8 |$ S
vi /etc/my.cnf 加入下列:' N+ J$ R, U/ K
[mysqld]
' V% `) ?; u' V8 Z
/ e; `' s. ]# Z0 y( S1 Pcharacter-set-server=utf8; H j7 p' k4 @. N
default_authentication_plugin=mysql_native_password9 q1 X, k( ~2 Z ?/ D8 A. [4 [
s1 D9 R9 v7 F( M$ z8 R
[mysql]& N3 i' O8 U8 W4 P' `8 W
default-character-set=utf82 e3 e5 K# c, m
1 R4 M6 T: _1 ]' |. _' d0 U
[client]
/ {3 _- E9 T' R. rdefault-character-set=utf8/ i, A* a( s% A3 ?+ i. O$ h
w8 M& z O+ C然後重啟mysqld) H2 x- M- A6 P9 h
service mysqld restart8 h' n* G q; D' Q7 H- J
搞定!!7 l6 g( D( U1 {0 F T3 e
/ \ L0 \+ h# `- I8 k: r) F, X, H% e
! c% o1 v, K( E3 f% G: b% x |
|