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

 找回密碼
 立即註冊
查看: 1003|回復: 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').
/ m9 M# I5 L" S1 c' k6 Y# ]! {& s; r
* Z1 a; Y) I- n+ V這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.
4 p6 k8 f5 I* v$ [/ K* j6 ~先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)$ Y, Q* @9 Y0 q$ E  O% }
登入mysql 然後輸入 :
% W3 w( J' l/ J! h& W. d8 e0 M$ pmysql> SHOW VARIABLES LIKE 'old_passwords';
6 i" L" u  K% G$ t! z2 {+------------------+-------+$ i% X' u$ T, q/ ?5 v" ^; B
| Variable_name | Value |
' \: b4 W* r, W$ Y+------------------+-------+
+ J  M5 k: g2 t+ X  N8 L* Z# G6 Q+ p| old_passwords | ON   |2 a; z" d2 W* F1 z$ M& I, i
+------------------+-------+2 R8 I9 M# D1 o
1 row in set (0.00 sec)6 X* B1 F4 p7 y3 X1 s
' @+ l) P  F) o
old_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart* b4 @- [  M1 T
或 在 mysql prompt下輸入:7 h. I: h5 e3 k5 t+ P
mysql> SET old_passwords=FALSE;  
# x' ^8 @# D* e& s7 x檢查mysql.user內 每個密碼長度:
, p. U/ a  B# m: Dmysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;  N# ~8 f$ P; w. W6 Q
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) % D6 C" V) ?: b+ P
) Y: y) {4 X" }" D. D
再重設原來的密碼:7 O  I- |  @6 E* s
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了4 n7 k% c% v: I4 V# [
mysql> flush privileges;, X. X; e0 Q) Q, m) X2 R, s8 l

& R/ n1 X: Q) l# W% \, I2 z再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼9 l& E/ I! Y3 L5 D: _9 U
注意:
' }( E' U5 g; y$ q$ n2 Z9 l如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================
& l; V4 q" E/ `; n; a1 S當mysql升級到 8.0.21時,php連到mysql出現2行errors:
/ D# X! H! Y" Lmysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers* V; p7 X. O; q+ C7 z- k' D. |
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers7 q8 r* Y7 L- o3 [# h
原因:
4 S5 H2 x6 N! U+ ]$ s
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:6 Q4 I; `! G$ j3 _% w8 Y
vi /etc/my.cnf  加入下列:5 E: T( L) V6 J
[mysqld], a  a7 T0 Q' o6 P' ?: L  L

$ K" I9 O: {' W0 s) Ncharacter-set-server=utf8
# F9 h, D& @) N* Q0 S! Z/ d7 Wdefault_authentication_plugin=mysql_native_password
' ~# t" z: \; T9 `2 ?5 D: L; R$ a8 _- u/ m$ J
[mysql]
- s* @9 E$ Q3 O" d' }default-character-set=utf88 ]4 [# a3 |8 _- f% R* g9 d

! i7 V1 `+ b7 X8 h% U: M& M1 j& ~[client]
. J' P. u3 P9 X$ U" Pdefault-character-set=utf8$ _% v( V$ n3 R! O, Y6 {+ \

3 M8 n( Z  r" p8 v7 d. p% W然後重啟mysqld
+ Y9 I) X) R  k% e4 E) G& jservice mysqld restart$ x( I# R- i( @  m0 ]0 |# C0 V, w. Z
搞定!!2 B6 o: V/ `3 G/ O5 K" r
8 R* U  F" N9 Z8 N' i

# l+ J5 \& z6 F4 O1 n
回復

使用道具 舉報

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

本版積分規則



中文酷站排行榜

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

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

GMT+8, 2024-12-25 02:03 , Processed in 0.065878 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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