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').+ ^4 K7 k! B# Y! s; }8 H y
3 n; E5 m7 q. Y( H& u
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.3 V" o7 F8 R8 B
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73): s$ P" ?& G0 E. y$ N
登入mysql 然後輸入 :
; E1 f/ D9 a" {, umysql> SHOW VARIABLES LIKE 'old_passwords';
* } w Y% {2 u9 K/ B& G( M+------------------+-------+
; H: Q1 S$ r4 ?0 n! j) w| Variable_name | Value |
9 x, c: _1 W6 N- v: N+------------------+-------+1 ~4 V/ K+ R. d2 U) H2 C
| old_passwords | ON |
7 z& I$ X9 a! ^1 {+------------------+-------+
, j% _, Q3 p5 P" _: H9 F' q1 row in set (0.00 sec)6 S$ O e4 S; w: I. T" R$ b* o
) L8 w, u S e6 O+ L1 U9 W. m
old_password ==> ON 就表示 /etc/my.cnf 裏的 old_passwords=1 設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
?" f% a7 k* r0 n- ~, b; k* x7 {或 在 mysql prompt下輸入:
/ ~7 Z2 n% T" M& [& H; mmysql> SET old_passwords=FALSE; : F- }" X7 v$ F$ y
檢查mysql.user內 每個密碼長度:4 @9 Z ?7 y2 i0 ]6 @
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user; m1 `2 m y- |& q% s$ `2 _
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) " P z W/ K! M8 b- e. ^
# x, Z! r! \* y/ F9 {
再重設原來的密碼:' U1 g ]* P5 O/ x0 M; Q
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼'); // 小心要核對原來 帳號@IP 更改,不要改錯了* [0 e; M: @- s2 K. @
mysql> flush privileges;
! X) @& ~# N& c2 |) g* G! J
7 v8 N4 ]" a f" N! j再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
' Q7 ~8 J/ g3 }6 @注意:
! s4 p' g: S, [9 Z5 X# b如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響===========================================================================$ O+ d( k z" N
當mysql升級到 8.0.21時,php連到mysql出現2行errors:; y; w" k! q2 N4 i7 s
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers/ T$ B7 t0 N4 Z
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers+ Y& a- P; f3 M6 G4 o/ l5 y7 k
原因:$ {7 \, P. L! p _( S1 C4 {' `
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:, } M6 ]# ]2 t8 _ f
vi /etc/my.cnf 加入下列:
1 V) | _' w/ q/ K- a; ?[mysqld]+ S' B; S, @$ I; J9 V* b
$ g7 z' Z& f0 \( m2 j# I% t' G$ m
character-set-server=utf8
/ d* k: t8 {& y% t1 ^5 M" edefault_authentication_plugin=mysql_native_password
& N' T6 B- ^9 T2 d" j+ j
' G3 a* `4 y# z& o[mysql]% |/ v+ G& `+ K- {5 w$ ~
default-character-set=utf8
& z8 S9 v6 M- f- f/ d# S' ^. d+ ?, @. E4 R( L9 U/ x9 Q) ^$ b. Y" S
[client]# u) G% ]8 z" s+ q7 H7 S& s% \! P
default-character-set=utf86 k0 y6 M3 N4 r% Y. m
- ^7 M# l6 e9 S# s, q) l3 B然後重啟mysqld# M* k2 B7 P- x7 N' h
service mysqld restart6 ^; k! v, Y8 j3 S
搞定!!
& ?( B$ m v! N( d5 R. F
8 E5 Z, J) a! p, c. o! C
; H3 t( Z. z1 ^/ Z9 Z4 A& w |