標題: 解決 php連接mysql指令mysqli_connect()等等的錯誤==>mysqlnd cannot connect to MySQL 4.1 [打印本頁] 作者: IT_man 時間: 2018-10-11 12:57 標題: 解決 php連接mysql指令mysqli_connect()等等的錯誤==>mysqlnd cannot connect to MySQL 4.1 當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')., y: x4 s% Z' |& {1 {
- o+ Y; @4 K& `8 F& s& c2 a; S& M這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.) i# D2 D. J% A1 p6 H3 U) h
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73) 3 V& }: t& g6 k登入mysql 然後輸入 : , S! t4 V# ?6 a+ Bmysql> SHOW VARIABLES LIKE 'old_passwords';- V2 x! U& S7 K: P# b
+------------------+-------+ 8 j" Q o: s, Y" `2 w; B+ U| Variable_name | Value | / x6 z7 Q* r1 X5 {+------------------+-------+" G G9 O1 F0 d, V. H9 A) T% A
| old_passwords | ON |( L6 D1 g) Z. T( I) r
+------------------+-------+* S. e" z, ?( l1 o- B* R2 V
1 row in set (0.00 sec) * L; x0 d) k7 B& _4 n$ o 8 l6 b3 _ @% H) X' j. h# y9 r4 ?) n* zold_password ==> ON 就表示 /etc/my.cnf 裏的 old_passwords=1 設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart6 q0 S7 h% n0 V* Y& A
或 在 mysql prompt下輸入:8 U8 B8 y7 q- c D! S
mysql> SET old_passwords=FALSE; 8 s( e K- ?( T0 E1 R1 t% ?$ C) i* |
檢查mysql.user內 每個密碼長度: * K0 z" E$ Y. @ _/ hmysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;# B/ h- r) e1 k, A5 O" c
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) 8 u" o9 I0 u' K% @9 _
. [$ R, `8 w1 u, P, d, {( C! M再重設原來的密碼:0 a6 ^- E. F' M
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼'); // 小心要核對原來 帳號@IP 更改,不要改錯了5 v9 G8 _8 M; C3 N
mysql> flush privileges; 4 b2 X* C7 b& |; ^7 o! {' s1 @* e/ Q$ N" M: Q/ S6 P
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼) U8 J5 R+ V7 M6 ]) a' l A- e. A
注意:: n7 O6 q: \- k. c2 a* N; ]% C
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響===========================================================================0 c& U7 G7 q2 C/ M
當mysql升級到 8.0.21時,php連到mysql出現2行errors:) y' R4 J8 X! {6 f+ H3 g. S, u
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers- w9 C+ x4 M, r0 C6 W. h6 F) I/ r
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers . E6 k# f! @0 v, L' v7 ?( J原因:, l, q* {0 Z- u
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:5 z5 I( T" s" G3 ]( S0 r5 a9 f
vi /etc/my.cnf 加入下列: b- F- L9 }2 L$ [0 h[mysqld] : ^% X- R7 f9 z! }$ A4 O% O6 {, h9 i, k
character-set-server=utf85 ?1 x9 v+ j8 G K3 d. Q: f; E
default_authentication_plugin=mysql_native_password; u& N$ G& G! A9 R, `& R9 E
- c: r$ X- D8 e# R6 @* P( F
[mysql]3 q4 C3 n* t( i
default-character-set=utf8 ( d; `* w: Y/ i! }" ~0 V: V6 L; I5 @( K0 R% G% N
[client]; |+ q$ m3 S0 U' u1 ^
default-character-set=utf8 $ L: R' B. \: f$ w8 J$ g0 v9 }' R9 I }, X
然後重啟mysqld. p5 u! ?/ s9 Z. ?. Z
service mysqld restart5 H i; _0 @7 Z2 r9 k
搞定!!; S3 O6 f' j0 u2 A% l
, \; f' _" v2 d4 T5 J, f