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

 找回密碼
 立即註冊
查看: 1130|回復: 0

[mysql] 解決 php連接mysql指令mysqli_connect()等等的錯誤==>mysqlnd cannot connect to MySQL 4.1

[複製鏈接]
發表於 2018-10-11 12:57:07 | 顯示全部樓層 |閱讀模式
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').
$ m/ ?% v$ T' ~9 c" z
/ y8 C3 z9 F; ^這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.6 H( a4 B8 v. h+ @2 F
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73), I9 A9 O$ U1 S6 s1 I9 N. D1 ]
登入mysql 然後輸入 :
& I3 G7 t+ L2 F5 T5 F5 dmysql> SHOW VARIABLES LIKE 'old_passwords';2 J7 i0 S9 U! y8 ^
+------------------+-------+; X- t8 K8 L3 S: v9 T! T/ I
| Variable_name | Value |
" N4 @& |. \# _+------------------+-------+
1 u* q  b9 B( p, `2 X! i$ x% C| old_passwords | ON   |, m0 A/ Z- D2 M- r/ W2 E1 \
+------------------+-------+. L. s+ h! N! H; c
1 row in set (0.00 sec)8 B6 B# Q% x# P" B; K# [- u

7 A3 c8 `, |8 I: d, ~: Aold_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart$ x2 D# [- K0 b! n$ \
或 在 mysql prompt下輸入:
6 ]! r# g4 {8 j% w8 S" B5 zmysql> SET old_passwords=FALSE;  
9 I! }. n" ]8 |; i檢查mysql.user內 每個密碼長度:
) [8 v& ^% E% t* k1 }8 }) X+ B: c+ rmysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
9 v4 N3 E+ M& R6 H$ I4 M如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) 4 l8 e8 z: ^+ V

+ S9 _+ V1 d" P: w. c: A再重設原來的密碼:* r3 K7 m: C! j7 a1 ]
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了# a+ X% I) V& N  j
mysql> flush privileges;0 \: d: E- u/ `- D, z  q

$ n5 Y, U2 o2 q+ b$ D& p再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
7 F' }" {$ ~9 \  d* I$ u注意:$ P$ J1 J2 v9 `; b% q  v! [6 _* N
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================2 @" w  J+ d/ T) M) m! O; O
當mysql升級到 8.0.21時,php連到mysql出現2行errors:/ y2 z" V" \7 @' T" n
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers6 G- v4 ?  @: B8 D( o; S4 @
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers5 Q8 `8 h3 R0 u5 e1 ?- f
原因:
% Z1 J, f$ ^' O2 n3 D
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
+ c; a; P0 J! Q' evi /etc/my.cnf  加入下列:
; @; t. ?$ ]" x* P2 K[mysqld]( D' B1 E9 D) }# b6 G1 i

. d) v& A* v9 L* w7 n2 ]5 d3 j% r8 J2 ]character-set-server=utf8
3 d" _6 B1 C* R  M" [% hdefault_authentication_plugin=mysql_native_password
, C, S% \$ l6 I7 N
/ Y* ]  `# }2 X6 a2 _' o) @[mysql]' l$ A6 F0 S. h( A" U" I
default-character-set=utf8
* c8 W" L" p- C, Z* e0 y
0 s( @9 h* k4 n; o& |+ u4 ][client]3 W: B  M6 T0 j6 k& O  u2 B4 e
default-character-set=utf8
9 R$ \. |3 B8 Q% l
3 A+ O: f8 U+ r6 k  w" D然後重啟mysqld/ p  @$ C2 D5 Y- \- r. @2 T2 G
service mysqld restart
& n, @8 r% r9 b3 ~' h. U) g/ y  j* }搞定!!+ o) H2 t) U8 e

2 g/ A7 S! I. X* J& {$ Z9 m6 o' U: o5 i; E  t, Q% x
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則



中文酷站排行榜

本區塊內容依據『電腦網路內容分級處理辦法』為限制級網站,限定年滿18歲以上或達當地國家法定年齡人士方可進入,且願接受本站各項條款,未滿18歲 謝絕進入瀏覽。為防範未滿18歲之未成年網友瀏覽網路上限制級內容的圖文資訊,建議您可進行網路內容分級組織ICRA分級服務的安裝與設定。 (為還給愛護 本站的網友一個純淨的論壇環境,本站設有管理員)

QQ|小黑屋|手機板| 52AV手機A片王

GMT+8, 2026-3-24 19:06 , Processed in 0.068862 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回復 返回頂部 返回列表