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

 找回密碼
 立即註冊
查看: 1111|回復: 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').
) [* `9 K1 c/ E* L
: N4 ~3 O) g) ^0 a- q這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.9 \, f" M& F  z! H5 [/ s
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
6 |9 r4 B/ l! ~6 k3 g% G- Q" v登入mysql 然後輸入 : . w8 E5 w! r3 u; ~1 d* J
mysql> SHOW VARIABLES LIKE 'old_passwords';- W+ b  R! A+ f' V- y( E) K
+------------------+-------+
* ~1 a% D& q" J- J. c3 U# W' y| Variable_name | Value |
! K0 m5 H* q, V- q+------------------+-------+
; J$ G/ P) m+ q# u! f' P6 p7 ^" || old_passwords | ON   |' \$ Z$ {) c$ T$ y3 t
+------------------+-------+/ R% g( ~" A  c7 ~+ S& m  F+ c+ {
1 row in set (0.00 sec)- l1 M" Q* ^: P4 b: \8 j
8 t) W( b1 ?! P% v1 P* Y
old_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart) y( l+ Y. m, N# V; Z! M
或 在 mysql prompt下輸入:
8 @9 h; e2 t8 y  \8 C3 M& E6 j3 ~% gmysql> SET old_passwords=FALSE;  * p3 l1 m1 {2 c/ ]
檢查mysql.user內 每個密碼長度:1 E$ m1 ~% S  Q
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
; J5 h/ ]+ Y$ |, C# a; V# m1 ]  O* r如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
. q  J& Y! l" f1 }4 `( z& }3 m0 s
再重設原來的密碼:
3 e# Y; w  R% a2 I! }; O7 bmysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了3 R5 S. ~# K8 r1 h
mysql> flush privileges;2 m, `6 v+ O/ ]
. a' Y: T* B& d1 B* I
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼( w; S8 B( e8 Z8 j; @8 {
注意:" T3 r2 s* b  W( z2 n
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================; E4 h: r. ?9 Z6 e6 W  o8 N0 U' {7 a
當mysql升級到 8.0.21時,php連到mysql出現2行errors:
# E, o2 ?9 t( j& G; D1 L9 ?mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
/ Q6 `8 P  L: ]& p) Vmysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers" C/ G" C* `& W$ t
原因:
+ E: d. N/ E7 I1 z; E( d7 |6 _
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
( Q% L8 A  o/ [( C- M& avi /etc/my.cnf  加入下列:
5 \/ B! e# {: ]. j% Z$ H4 F[mysqld]) ]1 w+ V" D; }+ l4 v$ T3 o
% O) b5 s- {2 r: p
character-set-server=utf8
5 h' P( ~( G. g; ~* ?, W9 U$ Ndefault_authentication_plugin=mysql_native_password
: U  K$ J1 c! g9 o# {2 _/ R9 p
( A, m6 D" z$ {( H: e# V! X[mysql]
2 {2 K9 x0 U- q$ I2 Xdefault-character-set=utf8; x' w& N) i$ F# i
, Y) a3 X" R: B% n" O
[client]
8 o2 G% ]+ Y1 M6 tdefault-character-set=utf8
, V; t9 i/ M1 v0 a( O7 m& ^6 J9 B+ Y, O2 d& `8 s7 ~
然後重啟mysqld
2 ^% r6 K* u$ ^7 b& ?service mysqld restart  |. J3 S2 v5 F8 D% Z
搞定!!
5 J* A$ h/ ^+ _. }/ x# {& z* O

) }. O4 g' m7 y) o7 [6 Q# r% q6 T$ W3 T- ^; \* X/ v3 q, O( s
回復

使用道具 舉報

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

本版積分規則



中文酷站排行榜

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

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

GMT+8, 2026-2-4 00:21 , Processed in 0.060567 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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