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

 找回密碼
 立即註冊
查看: 1080|回復: 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').
9 d: a+ w8 y3 H/ ]. n( g, f
& T/ t' b3 d6 G5 A5 z2 b$ L6 B# ?' g這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.4 \+ c  x3 k* A7 i" [* S
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)( V* Q/ p( q# F# Z0 e5 A/ [. ]
登入mysql 然後輸入 : 2 @3 ~6 X& J& @( P/ x
mysql> SHOW VARIABLES LIKE 'old_passwords';
4 L8 N& N! E/ i+------------------+-------+
7 }6 s, I( f; c$ W3 {! o| Variable_name | Value |
- h, o5 P% [2 j+------------------+-------+
7 c8 s# z9 |2 z" J" J/ w| old_passwords | ON   |
7 r" D& e( P- ^; }+------------------+-------++ R$ U+ J+ J* w2 ]' z
1 row in set (0.00 sec)9 E$ h) o2 ^4 x# }
/ A: G% N2 w" ]6 C
old_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart- e" T# @( v! h2 z% R
或 在 mysql prompt下輸入:6 L' x3 M3 x0 J: e/ l
mysql> SET old_passwords=FALSE;  4 U( m% b; Z. [) R% w  C( ?
檢查mysql.user內 每個密碼長度:
6 H7 [! t7 O; ?3 A& amysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
7 K) D4 ?5 B. m2 N2 y/ @如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) 8 e1 W- e9 G+ G
" f! `) W5 ?, P* V0 V! L
再重設原來的密碼:# g7 g: {" j* W- X  d' c
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了6 r# P' T* G5 Z7 ]5 n1 ]  i0 _
mysql> flush privileges;
$ j+ Y4 n, f! T% W1 T* a9 E/ }. y" E3 a3 g' P$ _. v7 H1 b
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼, o7 Z. x# d$ T( Y+ b+ S
注意:
# G9 X3 Y! ~" O- {% o. X8 E如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================
7 X$ y( H  a0 k: {2 m- d當mysql升級到 8.0.21時,php連到mysql出現2行errors:7 J& R: p( i6 e! C
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers% R% w) ?, l; o% Z5 J; G/ }
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
& n% k3 x+ `# J$ ]4 ^/ p2 @) ?9 F8 g$ p原因:
/ z& Z! E$ N' m3 Y. a; y
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
( o# }' h) }' h  k+ f$ D; I- F' @" N- evi /etc/my.cnf  加入下列:1 u- [  k0 ^6 r2 a- l2 y# A
[mysqld]
: [: w2 Y3 i& V8 f% h9 N" ~1 v" y4 @# L
character-set-server=utf8! J7 X2 O) l2 f
default_authentication_plugin=mysql_native_password6 p2 O) t9 S' x0 i  y/ B' b; D

3 W1 h  Y+ M+ C( x: y7 @  |[mysql]7 U! L& b" V8 [# W0 T' W3 ?$ [
default-character-set=utf8
6 \6 N4 f0 c" ^: I. a. |1 Q' s7 B
  i: d7 S5 f: \[client]
, Q' {, ]' o- c; u8 Odefault-character-set=utf8
8 q* H% a; c2 k( j3 k, w, J/ z7 Y, w0 H% ]
然後重啟mysqld2 H+ E6 M" p0 s$ d. G( S. e
service mysqld restart
; M' l4 Q) e$ I) ]- i8 X搞定!!
' `7 Y0 }$ _' o4 J- x7 k
3 O/ o) ^/ k/ \  h$ b  Z% ]& l
; i3 u$ U& C& \! L; Y4 G
回復

使用道具 舉報

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

本版積分規則



中文酷站排行榜

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

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

GMT+8, 2025-12-6 15:43 , Processed in 0.071244 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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