tid=90325&當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').
9 d: a+ w8 y3 H/ ]. n( g, f
& T/ t' b3 d6 G5 A5 z2 b$ L6 B# ?' g這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.4 \+ c x3 k* A7 i" [* S
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)( V* Q/ p( q# F# Z0 e5 A/ [. ]
登入mysql 然後輸入 : 2 @3 ~6 X& J& @( P/ x
mysql> SHOW VARIABLES LIKE 'old_passwords';
4 L8 N& N! E/ i+------------------+-------+
7 }6 s, I( f; c$ W3 {! o| Variable_name | Value |
- h, o5 P% [2 j+------------------+-------+
7 c8 s# z9 |2 z" J" J/ w| old_passwords | ON |
7 r" D& e( P- ^; }+------------------+-------++ R$ U+ J+ J* w2 ]' z
1 row in set (0.00 sec)9 E$ h) o2 ^4 x# }
/ A: G% N2 w" ]6 C
old_password ==> ON 就表示 /etc/my.cnf 裏的 old_passwords=1 設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart- e" T# @( v! h2 z% R
或 在 mysql prompt下輸入:6 L' x3 M3 x0 J: e/ l
mysql> SET old_passwords=FALSE; 4 U( m% b; Z. [) R% w C( ?
檢查mysql.user內 每個密碼長度:
6 H7 [! t7 O; ?3 A& amysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
7 K) D4 ?5 B. m2 N2 y/ @如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) 8 e1 W- e9 G+ G
" f! `) W5 ?, P* V0 V! L
再重設原來的密碼:# g7 g: {" j* W- X d' c
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼'); // 小心要核對原來 帳號@IP 更改,不要改錯了6 r# P' T* G5 Z7 ]5 n1 ] i0 _
mysql> flush privileges;
$ j+ Y4 n, f! T% W1 T* a9 E/ }. y" E3 a3 g' P$ _. v7 H1 b
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼, o7 Z. x# d$ T( Y+ b+ S
注意:
# G9 X3 Y! ~" O- {% o. X8 E如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響===========================================================================
7 X$ y( H a0 k: {2 m- d當mysql升級到 8.0.21時,php連到mysql出現2行errors:7 J& R: p( i6 e! C
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers% R% w) ?, l; o% Z5 J; G/ }
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
& n% k3 x+ `# J$ ]4 ^/ p2 @) ?9 F8 g$ p原因:/ z& Z! E$ N' m3 Y. a; y
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
( o# }' h) }' h k+ f$ D; I- F' @" N- evi /etc/my.cnf 加入下列:1 u- [ k0 ^6 r2 a- l2 y# A
[mysqld]
: [: w2 Y3 i& V8 f% h9 N" ~1 v" y4 @# L
character-set-server=utf8! J7 X2 O) l2 f
default_authentication_plugin=mysql_native_password6 p2 O) t9 S' x0 i y/ B' b; D
3 W1 h Y+ M+ C( x: y7 @ |[mysql]7 U! L& b" V8 [# W0 T' W3 ?$ [
default-character-set=utf8
6 \6 N4 f0 c" ^: I. a. |1 Q' s7 B
i: d7 S5 f: \[client]
, Q' {, ]' o- c; u8 Odefault-character-set=utf8
8 q* H% a; c2 k( j3 k, w, J/ z7 Y, w0 H% ]
然後重啟mysqld2 H+ E6 M" p0 s$ d. G( S. e
service mysqld restart
; M' l4 Q) e$ I) ]- i8 X搞定!!
' `7 Y0 }$ _' o4 J- x7 k3 O/ o) ^/ k/ \ h$ b Z% ]& l
; i3 u$ U& C& \! L; Y4 G
|