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

 找回密碼
 立即註冊
查看: 997|回復: 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').0 A% n& I* G* N& m, K) _: U

' ^6 g& B. G- R: S這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤., i4 v% n2 a. }- [  g8 q/ Z6 x
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
" C. ]# r! u- }) H/ o登入mysql 然後輸入 :
1 p7 F& c$ V/ A2 Ymysql> SHOW VARIABLES LIKE 'old_passwords';
5 ~( x) p: ~9 K8 ~0 `( v+------------------+-------+- p& U1 V, A1 n6 h
| Variable_name | Value |+ C4 |! t* Q: _& N& x0 P" P
+------------------+-------+
; K. M  B# {& }/ x, s| old_passwords | ON   |
" K- e- N( e, l& \, a' h, }4 m$ t+------------------+-------+3 D+ F( A- r& J# G  W3 @9 Z
1 row in set (0.00 sec)0 |; x. N$ D+ p* E8 X
) y: U2 b2 S" z/ _/ }
old_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart3 Q0 R  ~3 J4 x
或 在 mysql prompt下輸入:
( A2 X% z8 G/ j* U) I2 E& k4 j* Ymysql> SET old_passwords=FALSE;  4 D% ^9 Z+ E4 x( {+ H! B2 c- r
檢查mysql.user內 每個密碼長度:/ x, @% o, r' M9 c, x1 i" J
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
7 ^9 F3 Z2 n7 O0 x- I: t如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) 6 ]! [" b: F/ E" @0 i
! ]: l- y: l9 A6 X6 V
再重設原來的密碼:
6 F* @1 i: W. q8 P% {8 m( h) Imysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了
/ e4 J: x  k0 ^  J1 mmysql> flush privileges;! K* L( {$ j* r

1 k2 y7 w, ^8 @, b7 W8 z再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼. N; k) A/ s/ M4 ?/ E2 d
注意:" p* O" D8 W6 o# C, }
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================
9 U* [9 W$ m/ G- P, I/ U當mysql升級到 8.0.21時,php連到mysql出現2行errors:# z4 k6 u& d  L4 E, S* ~+ a
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
" X; Q3 ]5 R; m; f+ [$ _! R3 H/ n$ omysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
( Q6 `& Q2 n* [0 p( `% j原因:

; T; v, D2 a5 e# ]- O. ~在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:% c3 R2 a! F: \* J; Z
vi /etc/my.cnf  加入下列:0 M# K. ^! _) J/ N- l" d( I
[mysqld]/ N2 p6 J% C% @
( h* Q( \% |; O' X+ {1 l7 A
character-set-server=utf8
: i. m1 e, H6 s; j) x1 ]/ Q: pdefault_authentication_plugin=mysql_native_password
$ R5 X0 u% D. Z
  `; P) E7 h/ N; p4 X( n3 P  H% i[mysql]& y! X3 H& c( C# j% R' l
default-character-set=utf8& B7 _+ p' _$ i$ o4 r/ b2 b7 R
9 A! x' V" ?& N6 S. x
[client]
9 D& U4 }# s3 _$ R) `default-character-set=utf8; X" l" C* S. K. n8 J
1 c  `% d: ]7 W: t3 O! j5 E: O6 Q$ t
然後重啟mysqld9 t5 v; o! Q* D0 E8 S" N0 n
service mysqld restart7 s$ z; d' j$ a: T) u/ m2 U
搞定!!# ?+ e0 ^& e# u2 [' @/ O
/ R* N. G; ~0 T* A
: z8 M$ ~- g; I' q. j
回復

使用道具 舉報

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

本版積分規則



中文酷站排行榜

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

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

GMT+8, 2024-10-29 02:39 , Processed in 0.070116 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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