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

 找回密碼
 立即註冊
查看: 1004|回復: 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').
! i* u+ ^* w; b) r7 l% Z- g5 S- Z6 N0 s0 S! ?% U8 c
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.
' _8 K( H3 u0 H; ^- K- ~8 E2 J) ~先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)' P, `- P4 O4 v7 w3 T: W
登入mysql 然後輸入 : 0 X/ u3 I: u4 P8 \
mysql> SHOW VARIABLES LIKE 'old_passwords';
1 X' V5 y+ t$ P7 |+------------------+-------+0 t( i0 V) J- v- n, q) F" @. ~' W
| Variable_name | Value |
  }3 `6 T2 \1 `  a( x+------------------+-------+- {' l$ c$ w8 g  P* C; A" ?
| old_passwords | ON   |
+ `8 e9 R5 ~0 F- V! a+------------------+-------+
# y4 }* c% b& Q6 q; n1 row in set (0.00 sec)
3 F" T4 O' R2 @2 z. _# ]# Z$ J. A  j. |7 Z, Q# H; b; w- b
old_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
4 t9 m. a- ~  ?+ V5 w或 在 mysql prompt下輸入:. c* L2 l# n3 \8 `- U
mysql> SET old_passwords=FALSE;  
' A  a8 {* E2 |1 ~/ t2 N" v檢查mysql.user內 每個密碼長度:0 }# J+ W$ `7 w0 b! j- u: D
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;3 w9 B. r2 x* P  g
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) 0 B: G9 A/ q+ _1 X6 r
; u$ o: Z# K: a7 _; f8 T) r
再重設原來的密碼:( X( c; @1 z  t( U. F: @7 ~+ d9 [
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了0 q( S. [7 q" {8 R4 t  n. l3 i
mysql> flush privileges;; B, j/ J/ n- H6 x0 I, v- f9 h

8 s% q# y3 o2 Y0 y+ d再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
" x8 T% ?7 ]7 G6 X' b0 E注意:0 Q' h$ ~& W) f' r8 o* F
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================
9 c1 ^( R7 d  b1 y) \+ n/ g- k' G當mysql升級到 8.0.21時,php連到mysql出現2行errors:
; t7 j8 J, O, K1 Jmysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers0 @) v6 K2 G( {5 \
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers2 u1 l- l: r! m2 N2 b, u( k* {
原因:

7 D. `8 n' b% E; @- c) z2 Q' I0 x在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
$ h7 H- i# @4 J; X5 Z* ?vi /etc/my.cnf  加入下列:
0 q4 H* @+ `0 r( O7 O) J4 h[mysqld]
1 d% n7 ^' h: Y2 G8 \! g7 y+ p  X& ?5 q6 i! n& [
character-set-server=utf8, c! R" X9 W6 H
default_authentication_plugin=mysql_native_password
! n# C  o8 J8 s7 p' j7 a$ Y" Z3 ^# G; x; f& b- H7 H, ~1 C0 B
[mysql]
0 v; R. i2 R; d$ t3 }: idefault-character-set=utf8) M' Q) r) H0 s" O# o

$ Z( c4 G: ^7 l& @1 N' E) Y8 N[client]
! m9 K# B5 {3 O3 {# @* fdefault-character-set=utf8
4 p" {# I5 C% Q0 g; F' J  H& C1 r+ P! e! ]! K4 u/ L1 Y1 {
然後重啟mysqld
+ Q" j+ F' @; S  `service mysqld restart
- E: ~3 u- j) G  f. ^( M) N搞定!!5 n( s5 ^- R: z+ u1 X9 q! E& M
0 a4 {1 P& W& y
: i% \7 [8 e" n# s% R6 p& R
回復

使用道具 舉報

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

本版積分規則



中文酷站排行榜

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

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

GMT+8, 2024-12-25 02:31 , Processed in 0.070323 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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