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

 找回密碼
 立即註冊
查看: 1113|回復: 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').1 X" H' `1 `* B/ V: r
4 q3 o( v: d4 F0 c; v
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.3 S, w0 ^1 z5 v; E, X4 \" q  v
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
6 |: V+ d: E6 |$ `# H登入mysql 然後輸入 : ; z- z3 e3 `4 _4 L( R
mysql> SHOW VARIABLES LIKE 'old_passwords';
$ w4 L+ v5 `+ d+ q9 Y# o+------------------+-------+
! L( |9 N2 a7 u7 u; B| Variable_name | Value |- @# N& |! D: }
+------------------+-------+% v8 I6 F, L& A, B" o
| old_passwords | ON   |
  h5 ^, M9 C/ G$ F' }; D3 N+------------------+-------+
- H  C. z" d5 O1 row in set (0.00 sec)
$ y+ W6 m/ r: `2 B3 c- p: M$ }, n( H  L1 u4 N  y! D) x6 f, u
old_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart- n/ I# ]+ T3 a! q
或 在 mysql prompt下輸入:
: c0 i( z6 j8 O9 T1 _) amysql> SET old_passwords=FALSE;  
5 E/ K& ^0 ]5 R2 {  b' `% B檢查mysql.user內 每個密碼長度:! e% }6 u! f& l  Y) k
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;1 d0 }8 t3 k! B* C- Q5 T
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
+ S) r/ ~' F, p; b7 Y) l6 B
, w( o- y- A5 V8 O再重設原來的密碼:7 b% W6 `# |2 I# n" M5 ]* U  L; v. |1 h
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了
( |% [1 t$ U- B! B. Umysql> flush privileges;& Y. i8 K0 \  m, R" A5 \0 g* l" M
0 h' F  x! w' j* Z: R. M8 X
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼! f0 W. F2 x$ I1 R$ y: G
注意:
. \3 f9 u+ K, r) s+ m如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================
8 ]* Z3 r4 t# n- f) z2 X& k當mysql升級到 8.0.21時,php連到mysql出現2行errors:' q- d; b/ J7 x1 O9 h4 ]& a
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
* P8 C/ ]( y% @mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers, Y  [" n0 j& q) [! ^) |
原因:
2 I  w2 |) J  ]1 m
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
! e) G0 t) ]5 U5 d, Qvi /etc/my.cnf  加入下列:4 z( m& x' T) J* w* K1 B4 h5 P$ n0 a
[mysqld]
0 x- l' E5 ^4 R2 |/ h) ~8 d( c6 z: o9 S/ n
character-set-server=utf8
$ ~4 N' g, P6 \" g4 W' e; L( xdefault_authentication_plugin=mysql_native_password$ |- P2 a" u) M% T, U  L

3 O& W0 B' ^5 E, M6 B[mysql]2 i7 x! s2 ?8 m- \4 S" ?; y
default-character-set=utf8* f$ ~4 Q, U$ _; R9 ~8 U, u" U
+ Z9 d, ^( O" k
[client]4 a- \- V7 u/ H0 W; L
default-character-set=utf8
% o" i& T5 R! G6 ^3 i" m+ ]! M. q" \7 D8 I
2 {: u! q4 ^3 g& X( P: H然後重啟mysqld
1 @  O, T6 S7 g; m0 y8 rservice mysqld restart4 ?. n  p4 j7 K7 ~& }: s
搞定!!
4 d9 b! y0 A, t3 M! e  w
6 ?7 Y; z% \* K8 q. g
: R0 n( ~; x3 H/ \- m( p" J! v7 ^
回復

使用道具 舉報

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

本版積分規則



中文酷站排行榜

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

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

GMT+8, 2026-2-5 04:19 , Processed in 0.069071 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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