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

 找回密碼
 立即註冊
查看: 1024|回復: 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').
, L! _; x! E# P; G, x$ E% d
0 i$ D2 u; c; Q6 B) z7 ^. p+ f這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.
6 {% w8 M  y5 D% c3 `先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73). X0 B* r3 C/ r- R4 d# W
登入mysql 然後輸入 :
$ }7 S& d2 M* p! d1 v. x2 A% P5 Jmysql> SHOW VARIABLES LIKE 'old_passwords';
: K# z) A" r: i  A+------------------+-------+. W; C2 a' D- A8 X
| Variable_name | Value |6 t! ^5 ?( I* a0 J" \- W  C
+------------------+-------+% ^9 H$ f+ ]- ?8 z1 S* K1 D
| old_passwords | ON   |
) O2 n- m7 M, \. v( W+------------------+-------+
3 T# ~; ^8 _9 V$ \( `1 row in set (0.00 sec), z. O9 o0 O- n- v# l4 n: E) v) o
$ Q8 @( ~9 ~% O0 W; c) c
old_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
2 H5 q/ }* H. B; Y+ n" q5 b# J: b或 在 mysql prompt下輸入:! B3 q* c9 I7 M( t- G' h
mysql> SET old_passwords=FALSE;  
( _. _. Q: ^0 a8 ]" u" d5 j0 x+ }檢查mysql.user內 每個密碼長度:
+ l+ P3 t8 h$ S3 Xmysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;4 C8 D% F! T; U8 T4 ]  x7 Q2 F
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) ( W+ Z* D$ f" n5 P

. z+ ^/ [+ ?) U5 n! E  E# E再重設原來的密碼:2 G( u6 C3 P7 ?( ?$ o1 C
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了# K& o' l0 C. ^0 o  N2 _3 P2 l. ~( }
mysql> flush privileges;
, y6 _4 ~! n" [0 ^: j, r$ P
1 J8 s1 z+ M/ ^% Z" D再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
( q" o- r& i1 W. b6 L: j/ K& A注意:  m- g' f1 E: |1 D
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================. I8 c( y5 _+ L5 z! I- r* L+ L
當mysql升級到 8.0.21時,php連到mysql出現2行errors:
2 K& n) c7 S1 t2 P# K* b7 Qmysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
9 i4 y# l& D/ ?2 o; k9 i# C$ }6 [mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers7 |7 y/ t# T% X3 t+ C
原因:
" t) |9 z1 e) c" G! l% i( \
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
; q7 n2 _7 |  p& Y! ~2 cvi /etc/my.cnf  加入下列:( [, E& |) [1 b& D! n' S$ @8 `7 r
[mysqld]2 y; R' k1 x5 L$ r/ s5 t- A

8 {: |3 k* u9 |, e7 fcharacter-set-server=utf8, w/ X1 @+ v7 ]
default_authentication_plugin=mysql_native_password$ J8 S7 W8 E) f% c' ~. \6 N
! L7 ?( n: l( p5 t. F3 j, C% _1 N
[mysql]
4 j! R5 ?+ x* W0 ?0 i9 G  \. Ldefault-character-set=utf83 Y7 J! v1 r- d! C

6 K# |/ j( G: Y[client]
8 \; ^6 C  @3 v( H, ~; F3 Pdefault-character-set=utf8
4 _3 Q  }" J/ c
/ Q& w1 o- }" s/ r然後重啟mysqld8 R! j( r- E/ z* E0 g* P5 @
service mysqld restart  B2 t3 H& _" ?8 B* O0 ^& F
搞定!!. l8 S4 x$ `* b' l# W: z+ ^' d3 l
2 d# |* a% c7 N0 Q1 X7 P7 _

9 C! \3 }9 O+ O& o7 e; O9 F
回復

使用道具 舉報

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

本版積分規則



中文酷站排行榜

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

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

GMT+8, 2025-4-2 06:56 , Processed in 0.126513 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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