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

 找回密碼
 立即註冊
查看: 1023|回復: 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').+ ^4 K7 k! B# Y! s; }8 H  y
3 n; E5 m7 q. Y( H& u
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.3 V" o7 F8 R8 B
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73): s$ P" ?& G0 E. y$ N
登入mysql 然後輸入 :
; E1 f/ D9 a" {, umysql> SHOW VARIABLES LIKE 'old_passwords';
* }  w  Y% {2 u9 K/ B& G( M+------------------+-------+
; H: Q1 S$ r4 ?0 n! j) w| Variable_name | Value |
9 x, c: _1 W6 N- v: N+------------------+-------+1 ~4 V/ K+ R. d2 U) H2 C
| old_passwords | ON   |
7 z& I$ X9 a! ^1 {+------------------+-------+
, j% _, Q3 p5 P" _: H9 F' q1 row in set (0.00 sec)6 S$ O  e4 S; w: I. T" R$ b* o
) L8 w, u  S  e6 O+ L1 U9 W. m
old_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
  ?" f% a7 k* r0 n- ~, b; k* x7 {或 在 mysql prompt下輸入:
/ ~7 Z2 n% T" M& [& H; mmysql> SET old_passwords=FALSE;  : F- }" X7 v$ F$ y
檢查mysql.user內 每個密碼長度:4 @9 Z  ?7 y2 i0 ]6 @
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;  m1 `2 m  y- |& q% s$ `2 _
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) " P  z  W/ K! M8 b- e. ^
# x, Z! r! \* y/ F9 {
再重設原來的密碼:' U1 g  ]* P5 O/ x0 M; Q
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了* [0 e; M: @- s2 K. @
mysql> flush privileges;
! X) @& ~# N& c2 |) g* G! J
7 v8 N4 ]" a  f" N! j再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
' Q7 ~8 J/ g3 }6 @注意:
! s4 p' g: S, [9 Z5 X# b如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================$ O+ d( k  z" N
當mysql升級到 8.0.21時,php連到mysql出現2行errors:; y; w" k! q2 N4 i7 s
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers/ T$ B7 t0 N4 Z
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers+ Y& a- P; f3 M6 G4 o/ l5 y7 k
原因:
$ {7 \, P. L! p  _( S1 C4 {' `
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:, }  M6 ]# ]2 t8 _  f
vi /etc/my.cnf  加入下列:
1 V) |  _' w/ q/ K- a; ?[mysqld]+ S' B; S, @$ I; J9 V* b
$ g7 z' Z& f0 \( m2 j# I% t' G$ m
character-set-server=utf8
/ d* k: t8 {& y% t1 ^5 M" edefault_authentication_plugin=mysql_native_password
& N' T6 B- ^9 T2 d" j+ j
' G3 a* `4 y# z& o[mysql]% |/ v+ G& `+ K- {5 w$ ~
default-character-set=utf8
& z8 S9 v6 M- f- f/ d# S' ^. d+ ?, @. E4 R( L9 U/ x9 Q) ^$ b. Y" S
[client]# u) G% ]8 z" s+ q7 H7 S& s% \! P
default-character-set=utf86 k0 y6 M3 N4 r% Y. m

- ^7 M# l6 e9 S# s, q) l3 B然後重啟mysqld# M* k2 B7 P- x7 N' h
service mysqld restart6 ^; k! v, Y8 j3 S
搞定!!
& ?( B$ m  v! N( d5 R. F

8 E5 Z, J) a! p, c. o! C
; H3 t( Z. z1 ^/ Z9 Z4 A& w
回復

使用道具 舉報

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

本版積分規則



中文酷站排行榜

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

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

GMT+8, 2025-4-1 14:09 , Processed in 0.072568 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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