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

標題: 解決 php連接mysql指令mysqli_connect()等等的錯誤==>mysqlnd cannot connect to MySQL 4.1 [打印本頁]

作者: IT_man    時間: 2018-10-11 12:57
標題: 解決 php連接mysql指令mysqli_connect()等等的錯誤==>mysqlnd cannot connect to MySQL 4.1
當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 `$ R. r! W$ g5 `7 z7 V
' c4 R* ~) x' S3 Q: ?2 N& a$ O5 r
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.
/ l% N, l  I) S0 m* N先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)2 B# t: c! l' P) s& ^
登入mysql 然後輸入 :
0 Y- u. a# y: U2 T+ E, Umysql> SHOW VARIABLES LIKE 'old_passwords';- n" {& X& K5 e5 \1 |* j
+------------------+-------+8 b- Z2 y$ [6 a8 P
| Variable_name | Value |
- H1 r4 C. l5 b+------------------+-------+
# Y: g) S: f2 d' l9 b! N- J0 P- [| old_passwords | ON   |$ l. p7 o$ `1 h3 E3 L# L) k
+------------------+-------+
) k' l  g6 f% D+ M; `+ Z1 row in set (0.00 sec)' V; n1 @: p% h

8 {( u; S, k( Q& m/ k- t3 g3 ^old_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
; t. G( W5 p6 v4 R' q或 在 mysql prompt下輸入:
5 B) ]4 Y0 x% c: q/ Z( P' W% Fmysql> SET old_passwords=FALSE;  6 I7 n9 R7 T, I
檢查mysql.user內 每個密碼長度:5 V) k+ I- x& S0 g4 S! F0 q: c' B
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;5 z* ]- ]( P2 S9 |# z- r* ]
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
4 q; Y9 W$ A4 X  M3 s
% D3 `2 J( ]) x3 a8 s' f! W5 N5 |再重設原來的密碼:
' e. `' c% G! ~; _0 o* A9 rmysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了. A% }- m# I1 g9 c1 J
mysql> flush privileges;
& Q1 g$ w- X. N! v, M. A9 }$ }2 m) d' y7 H; c$ O
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
/ J- j5 z- c- t- d  x注意:
2 ^7 C2 ]. ~! ?" |. P" F如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================' O" g0 {  _5 p" N; E: j
當mysql升級到 8.0.21時,php連到mysql出現2行errors:4 x  b4 @# m+ [6 m" u/ R& f, L
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers, W: {# [; V7 r9 e, V( c$ m4 R8 _
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers- D# q' y, `& Y# r: F6 h
原因:

& I( p" Y* H0 M" d1 b# y在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
2 r% {8 n0 c2 R6 U- J; |vi /etc/my.cnf  加入下列:
; {& |! P2 G8 j7 m3 s[mysqld], m" O3 k% k6 Y4 Z

- ]- i9 t2 y9 @( Q: W  fcharacter-set-server=utf81 l) I9 J' x9 H7 ?! g
default_authentication_plugin=mysql_native_password
* A9 R' o5 \% K  t' R) m5 ^( {
' p: ]" O- Z7 ~) K# e' ~6 b+ n( b3 z[mysql]
, i: \4 s1 S- K( z; Ldefault-character-set=utf8# H% v6 A/ H4 G

( b3 ?! K! V: Y% C8 W[client]
; D( n  Y- T6 i: z& I: ddefault-character-set=utf80 _7 I2 I$ D$ k$ I
) f- x+ F. H1 F+ a" i! w$ E
然後重啟mysqld
- O0 R: p! ^( W2 Z# Yservice mysqld restart$ u: {( s2 a0 o' f, g2 r
搞定!!' v7 L) z$ z, d. ]7 U* g' ~: n

0 K  Y% m% n: R9 M5 b0 |8 J5 |1 N3 X- K. A6 m





歡迎光臨 52AV手機A片王|52AV.ONE (https://www.52av23.xyz/) Powered by Discuz! X3.2