當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').
% a) \; Y- v8 O6 S$ z4 T" C% H1 t4 m; [
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.% X# U9 p; g, U5 B1 t
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
8 G6 L5 m( @" b1 q登入mysql 然後輸入 : " u$ ?4 U! E; h1 y# y
mysql> SHOW VARIABLES LIKE 'old_passwords';
3 A, t1 x( ]5 ^7 }5 R# Q+------------------+-------+6 A" \: j4 m+ i
| Variable_name | Value |
H. d5 G. ?% F2 ?5 v- z+------------------+-------+4 I( ~3 e g! Z b4 ]
| old_passwords | ON |# c* e- X% Y. Z# s
+------------------+-------+
& m# D& v8 l/ w4 J0 ?+ e3 k1 row in set (0.00 sec)
: q3 H; S! h C" j4 d% E5 O7 f4 V* z/ j: m9 P, \) P+ G
old_password ==> ON 就表示 /etc/my.cnf 裏的 old_passwords=1 設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
9 t' ^4 q4 ?3 O# d% {或 在 mysql prompt下輸入:
9 e B( {2 W) Nmysql> SET old_passwords=FALSE; 5 b! l# {( X$ [' U3 Y( T/ M v
檢查mysql.user內 每個密碼長度:: N g4 O2 E5 v H. Z6 n/ i
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user; w8 ?1 x$ M* R9 W
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) . R0 a0 M J. t/ ~9 T
' V3 D5 p+ \4 C
再重設原來的密碼:4 f4 L J2 D$ I, P( k& h
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼'); // 小心要核對原來 帳號@IP 更改,不要改錯了
3 k5 x' I5 J2 X, P9 j" i* smysql> flush privileges;
- w5 C3 [0 i6 ^# z( T0 J$ o) u5 C4 k3 J! A% W% o
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼8 H* W& S! t" b& D2 L
注意:' g9 p* `- _1 b. P; |0 O: E& H
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響===========================================================================
# z/ j- b* f4 d. g8 i當mysql升級到 8.0.21時,php連到mysql出現2行errors:
+ {& |5 V/ e: X$ ]- ]( ]3 nmysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers9 J6 O, G% b/ u8 y! |% F4 F* m1 w' i
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
* d+ b+ @# y2 V. g% O1 H原因:
$ P! I: ]( Q4 S0 q在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:/ T. V* S) S+ E. Y
vi /etc/my.cnf 加入下列:( E3 P* `4 `! c5 D7 f
[mysqld]
- M6 y4 l4 p- \7 k
5 T6 C1 [: m2 f% {character-set-server=utf8& p: |- ?% K5 d! w
default_authentication_plugin=mysql_native_password% G* Q0 h- e9 n! y& Y* V
1 b }2 L# ]8 `3 ?+ S* Q* n2 S( q& k[mysql]5 `8 a/ E. `! o; x; U, `
default-character-set=utf80 `3 Y( {8 ?7 m9 B! V: N: V5 L
. j, v. \) s: t
[client]7 b. k# z9 Z: Y4 ?6 f
default-character-set=utf8
7 \5 _' r' v+ G4 k% U$ D$ o; R4 k3 n# O4 w; c
然後重啟mysqld
; h' O8 i% I+ D$ ?. a" D1 [6 M a6 hservice mysqld restart
* t2 r S0 T, b5 d( s& ~搞定!!
5 \1 y( `" q8 i% ?
4 h! N6 k# {8 P' L/ T
# H9 ~, e4 ^/ m |
|