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 x3 k* a; q! M# U
, \* U6 N. m8 E$ N這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.. {, C/ U* u2 S) C6 x3 w, g, n
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)) Q0 Q j" E0 E. X, l* V
登入mysql 然後輸入 :
) t- q8 B, W4 O' w9 Zmysql> SHOW VARIABLES LIKE 'old_passwords';
, [) i: i5 G. \% S& y+------------------+-------+
. [! X( P! t# T) j- h| Variable_name | Value |
' p6 d" p- w8 ^/ i2 w+ p3 Z+------------------+-------+: F% V: q6 \! B$ z5 H9 B7 @
| old_passwords | ON |
. e1 a! a/ A% v" k% X+------------------+-------+$ o3 r2 Q0 d( Z3 W3 A- [! \
1 row in set (0.00 sec)
' H% {' o. d. Q1 g
6 c0 o. f" U) Q7 L! p6 }8 Bold_password ==> ON 就表示 /etc/my.cnf 裏的 old_passwords=1 設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
2 g/ u1 W8 ?/ R3 j# Y9 F$ q& f或 在 mysql prompt下輸入:
$ W7 c1 C% E& g% qmysql> SET old_passwords=FALSE;
% @2 n4 p- x: S* w! X4 P檢查mysql.user內 每個密碼長度:
5 S- B o8 V9 b& [0 e+ o. bmysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;3 d( x4 v3 k, v# S
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
$ _0 J" T; Y5 ^# X) O9 b6 u$ F2 k. ]% N7 S
再重設原來的密碼:# L. ~0 A2 ^" M" F2 ~5 v- U
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼'); // 小心要核對原來 帳號@IP 更改,不要改錯了
! N4 w) M2 a8 o$ Q# k4 r6 }% amysql> flush privileges;
6 b6 F) J/ P/ n) F# D$ E+ X! ?8 B5 P: n1 R
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼" B2 S# Q" U- ?7 v
注意:" n3 y ^( o5 T2 P7 {
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響===========================================================================
# K: F7 m6 y! W) p+ f當mysql升級到 8.0.21時,php連到mysql出現2行errors:% z1 Y9 [# b9 Z' l
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
- t8 \: W; N( Omysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
5 ^* h, {; P3 L- H原因:, a" |$ N+ ]! p* a
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
P7 o" n/ B% w. Z) I; ~+ Vvi /etc/my.cnf 加入下列:
2 p. H0 I2 w3 B& k( g( U$ x[mysqld]
3 t" C! c7 G! a. x( T6 k% E' a& W& l
character-set-server=utf8* [. i$ i" b5 y5 X6 ^8 f0 i
default_authentication_plugin=mysql_native_password
9 ~2 _5 L! n1 v% w' A5 p- C) r
[mysql]5 v: l7 n$ z. J" X( e5 x
default-character-set=utf81 i3 H: ~ x7 i( s) |5 A: a6 A, v; S
6 A) r: B8 {1 [( }1 \' u! m! M[client]
; N& V9 C$ \$ }$ ddefault-character-set=utf88 X) F- i/ u( a% x w. v G
" a* \7 n' c4 ?% s1 a7 ?" z2 u然後重啟mysqld
9 n. Q' \& ] W( w! Vservice mysqld restart' S# w5 `# F3 d
搞定!!
n; Y3 C- T6 n8 m1 L2 ^6 r% v- n4 _) }
3 R! P- _& H8 }$ y& d8 _0 V% F) f |