52AV手機A片王|52AV.ONE

標題: 解決 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')." W# I" y3 W) [1 c9 @; Y
5 _: U3 v  d% A. `$ q
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.: K9 z( Y3 f1 w4 w
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73); N3 q8 m' m# H
登入mysql 然後輸入 :
( B4 n# g( Y, W/ P3 T+ \+ ~mysql> SHOW VARIABLES LIKE 'old_passwords';, }! ^* i  |- m+ r. p* y& \
+------------------+-------+' o( a: O( A8 v. v. `
| Variable_name | Value |
% t( o4 ]  r: h( I+------------------+-------+
. B* o# K$ \- \8 ~| old_passwords | ON   |; {" H5 `% Z7 ^5 o% Q2 u( N) c3 O& t
+------------------+-------+, V0 }0 m. j% G% M1 ?
1 row in set (0.00 sec)
8 d2 T  d( C( O! d! i1 h* h0 O) C' P8 z
old_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
5 u+ ]3 Q! J6 i或 在 mysql prompt下輸入:
+ s4 b' T% g4 \" K: t( nmysql> SET old_passwords=FALSE;  ( x3 o- m- a( ?# C+ ~9 h
檢查mysql.user內 每個密碼長度:
& n8 E( L; l! r5 b+ h8 _  y! smysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
# B. g: I$ T8 }; Q( P  D) X如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) / g8 |. _2 w9 ]4 {# s1 F* x. u
* Z3 F$ E. y- k$ u8 C
再重設原來的密碼:
" ?/ X, Z5 D. j# p" _mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了' z2 R, c1 n, _' w, w' `! L5 a
mysql> flush privileges;6 F% N  o. z; m6 L4 P6 O: z

2 |) Y( q2 B/ j0 t; |再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
6 U+ D2 ]" D' P$ `6 C! x0 A; \注意:
9 {1 }! e8 l7 X3 ~如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================) e3 u' E; g2 C
當mysql升級到 8.0.21時,php連到mysql出現2行errors:
6 }4 H+ ?6 D1 E$ Q7 E! kmysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
) n0 m! d. b+ n  tmysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
9 O3 _3 w0 K1 P4 ]; _原因:

# s' u5 q! w7 N在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
6 c4 }) o: X: h; _+ Svi /etc/my.cnf  加入下列:' }; S0 d; T% \
[mysqld]
& ^& N& ^9 n$ @9 f, L, |
; k' s+ X# x; C$ w5 j, z/ `4 \/ Rcharacter-set-server=utf83 c6 F7 R. x0 }$ i, u
default_authentication_plugin=mysql_native_password  B' O% d/ d/ V
* v4 n* ~( d' ?( b
[mysql]
; r/ P* N' V5 ~  {1 {  w$ S! B2 q4 Mdefault-character-set=utf8" S  I& R& q3 f

7 N1 s3 r- {" A& ~( y1 V[client]
" o& X* ^2 m( ^8 M! j9 A' e" Bdefault-character-set=utf8
- m2 U# k2 v+ s0 J* t
, [8 {, |! D1 }7 e- k6 m然後重啟mysqld
) Z/ t! s/ _! N/ p* X( Y$ xservice mysqld restart, H+ P3 @! z$ c" g
搞定!!
8 Z- j  d+ J' l! I; x8 b

$ D+ r; z' V* p8 r: G% _  w. t  M2 J  U6 z6 l





歡迎光臨 52AV手機A片王|52AV.ONE (https://www.itech.casa/) Powered by Discuz! X3.2