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

 找回密碼
 立即註冊
查看: 1129|回復: 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').# u9 a5 ]5 W. e$ _: X2 V

9 V2 \4 m8 i% \- }/ S" ?* B2 [這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.9 n2 \0 q. D  Y/ S- w* ~4 [
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
9 B: O+ ^" |, O5 J8 M1 j登入mysql 然後輸入 :
% H9 a* v& c0 `mysql> SHOW VARIABLES LIKE 'old_passwords';
. k% b- v! T5 I+------------------+-------+
& J0 R# j% Y3 e5 k* v| Variable_name | Value |
' M' h3 q( a* Q6 v5 w) N$ i+------------------+-------+
& V# s& D- g- o' _) l! D8 O| old_passwords | ON   |
$ m0 [3 b! P& A- q6 |* A+------------------+-------+
  V" `. D7 m* D6 [5 P! x1 row in set (0.00 sec)
7 ]; r0 j/ c7 q. N0 U4 Q0 U- t8 h
2 q3 D$ H& O* w* M3 o& J% kold_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart/ h1 n. H& n2 u7 d
或 在 mysql prompt下輸入:
# f4 [0 z4 a$ m$ |mysql> SET old_passwords=FALSE;  ( {1 \# Y, P- Z& _
檢查mysql.user內 每個密碼長度:
1 o+ k( q$ M. H: h4 umysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;0 ]# d2 V" W# h, n
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) 1 d4 a3 f6 ]3 S( Q8 D  H" z

$ G' K) f. i$ g& B" W再重設原來的密碼:
% M$ ]0 j' H. |# Lmysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了
2 n0 l+ W8 B0 l7 q# f+ umysql> flush privileges;
" b" ^$ b) I9 y3 q; s/ V
7 [# {: S% W0 o+ o# t6 B" b4 M再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼7 j& Q0 z  d! i% I# q4 U! g
注意:/ j$ m7 ^* Q0 V9 x
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================
; Z$ @6 d( \! ^5 L; W當mysql升級到 8.0.21時,php連到mysql出現2行errors:
+ ?/ K/ S( [# m8 Y' smysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
) y' K" {6 H' F$ q5 F0 [8 |mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
! z: T9 R3 R5 j原因:

* @4 |+ j( C5 F( d4 x; N0 [在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:- `4 }( m. v; w- z! [
vi /etc/my.cnf  加入下列:
5 C0 N! W9 h' X* A) P4 I[mysqld]+ k+ R# C: q: d

# \5 ^! i3 a0 t% f& ^; G0 `/ Hcharacter-set-server=utf8
  i- i0 u, g, G% z- n& Jdefault_authentication_plugin=mysql_native_password( Y2 E" p" m5 @* Y; c2 e7 u
6 w/ e% w8 l( d- H( b0 L! P
[mysql]. v# y  }  V( H
default-character-set=utf8
, w: _  F  s" m, ?' J
6 u, B0 x5 w/ `/ V[client]) h# c: e( i3 H! P- l
default-character-set=utf8
( E- ^9 J: u% h; T/ E' z0 V6 B  F7 e9 |
然後重啟mysqld! z, h4 B: C# O6 s# x
service mysqld restart
  Q' _4 C' ~% z' ?6 f3 i8 d; P, }搞定!!$ w7 K( ^7 k1 U8 h- t6 N: Y

! k; y+ c# j1 i& |  t/ c
  Q4 i! {9 s  U2 p  T% |2 M6 `! {3 U
回復

使用道具 舉報

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

本版積分規則



中文酷站排行榜

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

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

GMT+8, 2026-3-24 03:11 , Processed in 0.070422 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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