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

 找回密碼
 立即註冊
查看: 1029|回復: 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 y  r0 z2 @1 @  A) T2 D
# G) B" \; l# L& Q5 m& K7 M( S7 b, @
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.
, A5 t& s8 @; G% G  x4 Y- m先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
; z8 p, ?* Z% c" P6 c登入mysql 然後輸入 : ) o+ h' ]8 u$ l4 V
mysql> SHOW VARIABLES LIKE 'old_passwords';
3 ?, a- k5 B" g! ]' c! c+------------------+-------+& r8 ]0 ~+ C& Z- T5 h) M; F( `8 B- P% J% \
| Variable_name | Value |! J+ u4 G) G4 h( ]1 P+ W# Q" u  P1 {
+------------------+-------+
$ M" @: G( a) e# F* M+ U% l| old_passwords | ON   |
( H8 Q2 ^$ ?; o- {" n$ k+------------------+-------+
, U4 i7 X2 |( J" @! A4 B( m1 row in set (0.00 sec)
8 u* V1 h# N8 |" `
5 V- q: i$ H" m6 E. ~# zold_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
  `- k5 K  o0 V) w% d或 在 mysql prompt下輸入:, S3 U* s6 t/ K2 i. c
mysql> SET old_passwords=FALSE;  
/ x- X0 M; Z! e/ [1 I檢查mysql.user內 每個密碼長度:# H) O9 @; U9 W! u
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
1 q8 r6 ^. G  {" \+ e) u# e如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) % X' X# o7 v/ j. F" _) }
6 U5 A9 U# J; l' U! }2 B
再重設原來的密碼:
( Y1 d( A  j6 u! \2 [mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了
4 o  @( u, R% F5 B2 Q) t( d; jmysql> flush privileges;
: ~- k3 `* E" h* u; b
/ H2 v1 B; \) W0 L& o+ `再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼+ ?; g& w( K) t* A! X# ]7 d
注意:
  b' B+ F" f$ j7 U3 I9 u) S! ^5 k如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================
4 g8 Z$ ?0 }3 `8 T6 u2 n& g/ Q5 W1 N當mysql升級到 8.0.21時,php連到mysql出現2行errors:4 Q0 F% m. t) Y
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers% k3 G( p/ I* S3 X: w6 ]
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers1 G! b  \/ |" y4 i# r% R
原因:

: z( t3 x7 G! n* S5 c- n2 j在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:$ b; x4 F% t$ |) |
vi /etc/my.cnf  加入下列:
3 ~: [5 J( t, r4 C[mysqld]
: W) I6 G2 p6 g% x: ^6 B; E. `8 A; h
character-set-server=utf8
5 |* [6 \) i" x# Adefault_authentication_plugin=mysql_native_password  e* N1 H  Y, `7 g- c

0 j  w8 p% e6 @4 q0 l/ |4 X% {[mysql]
" e2 j# `0 O' ?+ I% @default-character-set=utf8$ x+ f# @# K$ ?8 g! h) A6 s$ M2 z$ k
# n; u" f# |. [7 r' j' M
[client]
3 [6 ^5 U8 m9 {) s$ Fdefault-character-set=utf8& Q: s- C9 A6 G  y3 C2 V9 z5 n5 s
8 v( q) T$ [: Z* ~6 S" j+ m
然後重啟mysqld' ?: e! B5 ]% c) f' S. z
service mysqld restart
- h$ v! i1 B5 d( c搞定!!
- i& }3 w3 G  j3 X8 ?" P( s

4 ]" ]  s; c  o( F" O. V! r) l) W5 c1 `) \
回復

使用道具 舉報

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

本版積分規則



中文酷站排行榜

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

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

GMT+8, 2025-5-13 15:12 , Processed in 0.060224 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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