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

 找回密碼
 立即註冊
查看: 996|回復: 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').
! U; y5 @! l+ f9 d
8 e0 S9 }, G- H( J這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.
0 {2 U* S  |4 {7 U7 U. G. P先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)0 \; V* c6 F5 B) w
登入mysql 然後輸入 : 0 x* N) m. K; R: I) c) ]1 P" M3 l% o
mysql> SHOW VARIABLES LIKE 'old_passwords';
4 T* |8 a& U% X- R1 C+------------------+-------+
; P2 Y% K( c4 X8 Z- L* r8 X| Variable_name | Value |
& h5 g" k3 U7 E0 o/ `+------------------+-------+
2 c  v! g1 ~; C8 V- U9 ^; E| old_passwords | ON   |0 ^6 E" }- _( q% q4 n# `2 X1 H
+------------------+-------+! k! Y3 d8 M4 ]
1 row in set (0.00 sec)6 A/ _+ W) _3 U) p+ ]: J$ }
* D( v3 l% j/ i  O8 a0 V* @
old_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
0 p& L2 C7 D$ g或 在 mysql prompt下輸入:
) x7 n' f- G9 A2 w8 dmysql> SET old_passwords=FALSE;  
- Z/ ^( x1 w2 F2 e檢查mysql.user內 每個密碼長度:
; q6 y0 A" _5 g4 Q* Dmysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;2 `" |1 d: ^3 w5 a' f* @
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
, h" F. R6 d  V+ g& ?  g9 B2 y- ?+ ?5 g8 C+ i  W, C% n0 U
再重設原來的密碼:% W7 v' T& I. M- W! h7 A
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了
2 f" l5 L/ u# g) B9 X* E# Imysql> flush privileges;8 h. j! C! o6 N: k, ?; A

) m7 k; E1 Z9 w再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
) y9 P1 D. C9 J1 A# }5 _注意:& T$ r  _1 N* r$ P) F+ N$ Z
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================  {' b  }- a  U3 u' x* V
當mysql升級到 8.0.21時,php連到mysql出現2行errors:
! }$ ~" h: r- t# t: C2 O, d& Mmysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers6 f0 p' H3 F. J5 d3 l+ @- d- K
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers9 Q$ J9 F" t, c
原因:
) B( e7 o8 Y) k5 }. M# Y' q3 O
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:2 ^' M4 n7 C. Z
vi /etc/my.cnf  加入下列:& q& I  y5 h9 H% L9 I1 D8 X
[mysqld]  ]) C/ U" q% @' ~, L
3 k* Z" f" O% |+ F6 F
character-set-server=utf8
% y& |5 M+ E* _/ T0 gdefault_authentication_plugin=mysql_native_password9 P- S: z9 w6 Y' f" C7 I
: i- y7 s# \# V, k% d4 i1 s7 t
[mysql]
5 w* s$ J$ W, m# h$ k/ Zdefault-character-set=utf8- B$ R) @  i# I$ A" K3 n+ W+ I3 D8 W
0 F" j8 y0 W4 x: {5 R1 h
[client]
) z! a8 m! Y4 Zdefault-character-set=utf8+ H8 m  ?; N9 J$ W5 G, |

, a( Y% [! K: f5 a2 N# U# b4 r; E然後重啟mysqld6 b2 U3 b2 I* y) P, f0 b. y
service mysqld restart
+ Q* i% F& }+ H, i3 |$ g! @; L5 G: |搞定!!" X7 X0 _& L* z- Z: {7 i
! B4 f7 D1 j. j

6 ^* }' \$ ?1 i2 N$ J/ h2 x% m
回復

使用道具 舉報

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

本版積分規則



中文酷站排行榜

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

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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