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

 找回密碼
 立即註冊
查看: 1128|回復: 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').
+ T4 i2 }; M" g* o- Z: U) g( w# X* B8 y  g" K
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.2 t5 T1 I' t; \, c. A
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
1 ^2 q' d( |0 a" I' X0 w登入mysql 然後輸入 :
, l. Z! ~8 O6 ?: c) ^9 U' Rmysql> SHOW VARIABLES LIKE 'old_passwords';
* {' @  j. S6 {  e$ W" s+------------------+-------+
. W+ ?2 g$ ?" `# B& y) C, t4 _| Variable_name | Value |2 g6 @% y! \5 v- Q8 M7 K0 S
+------------------+-------+) h0 q/ U+ j: k# M( B5 [9 Y
| old_passwords | ON   |
) X/ J' Y# v5 k% v) R+------------------+-------+) u7 O; n( v7 [; n' Y
1 row in set (0.00 sec)
- Q7 u; q: w* F
. H5 c9 ^0 Q1 \9 a1 ~old_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
2 K' ~9 D. m+ a# b: ~. ~9 U或 在 mysql prompt下輸入:7 {1 g: ]" K5 d. O1 k. ?3 b+ E5 c
mysql> SET old_passwords=FALSE;  # @# p0 M% f9 x4 j8 `
檢查mysql.user內 每個密碼長度:' N2 k% z) w9 \5 j9 T
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
: W) _+ Q0 `8 ?7 h0 t" F' r如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) 1 X( N  y" ], \3 h& p* H

. Y! W3 ~- c) ^1 X再重設原來的密碼:+ J+ o+ C1 \) {
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了
  t0 c; R9 D5 q* S' `mysql> flush privileges;
8 T( P" M. P& @9 O( ?  o" q7 c
1 n' F; b2 T+ ~* d  H再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼. d  D% h- Y- m, l( i
注意:# R3 z. H& S9 D- Y7 y
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================; L/ M* _# X( O7 e0 H/ ^& G
當mysql升級到 8.0.21時,php連到mysql出現2行errors:( q9 S" M- |6 F, S6 L
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers- ^; D' k' _" |$ Y
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
3 t/ _, X6 W( ^0 o$ I原因:

# x( a: K: Q* C- }2 P$ B. e/ j在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:) c+ w" n6 x/ z3 R; {: L* _
vi /etc/my.cnf  加入下列:
1 G% f$ w, }  a[mysqld]
5 w3 o! Z( F6 r) A: Q" R4 _
- v5 c. M! S3 V( U0 kcharacter-set-server=utf8- j3 z& f& f& N5 M( H+ k
default_authentication_plugin=mysql_native_password
  F/ O0 U1 N) V4 f3 f4 b8 |  C2 M( h/ y
[mysql]+ U! O0 |/ q' D% P# O
default-character-set=utf8* i; @; E% @; ^& n3 `& n& U
, }" a3 g5 U) R' Q6 K" V) R
[client], j3 z/ z- w' |- i
default-character-set=utf8$ Z& J# F, K( R
. a1 ]5 p# y0 N4 ]0 Z5 A+ ]# s
然後重啟mysqld% U1 ^8 y" B2 b, O; \' J: k
service mysqld restart
3 Q. @8 o/ n6 }: L/ q; Y, `搞定!!
6 v! F, @; T9 ?& h4 ?
/ {0 D' E, [; K+ P3 v

# E/ E! Y5 r3 u
回復

使用道具 舉報

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

本版積分規則



中文酷站排行榜

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

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

GMT+8, 2026-3-24 00:53 , Processed in 0.059116 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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