萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

解決 mysqlnd「old insecure authentication」錯誤:升級密碼雜湊至 41 字元

錯誤現象

PDOException: SQLSTATE[HY000] [2000]
mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication.
Please use SET PASSWORD = PASSWORD('your_password') to update.

原因:MySQL 伺服器帳號仍使用舊 16 字元雜湊(pre-4.1 格式),而 mysqlnd(PHP 原生驅動)強制要求 41 字元新格式。

快速診斷

SELECT user, LENGTH(Password) FROM mysql.user;
+-------+------------------+
| user  | LENGTH(Password) |
+-------+------------------+
| demo  |               16 |  -- 舊格式
| demo  |               16 |
+-------+------------------+

修正步驟

  1. 更新密碼雜湊(以 demo 帳號為例):
    UPDATE mysql.user SET Password = PASSWORD('demo') WHERE User = 'demo';
    FLUSH PRIVILEGES;
  2. 驗證長度變為 41:
    SELECT user, LENGTH(Password) FROM mysql.user;
    +-------+------------------+
    | user  | LENGTH(Password) |
    +-------+------------------+
    | demo  |               41 |
    | demo  |               41 |
    +-------+------------------+
  3. 關閉舊密碼模式(my.cnf):
    [mysqld]
    old_passwords = 0
    重啟 MySQL:systemctl restart mysqld。

補充說明

  • PASSWORD() 函數在 MySQL 5.7.6+ 已移除,改用 ALTER USER 'user'@'host' IDENTIFIED BY 'pwd';(自動使用 caching_sha2_password 或 mysql_native_password)。
  • 若舊版 PHP (5.2-) 需相容,可暫時保留 old_passwords=1 並建立雙帳號,但強烈建議升級 PHP 並統一新格式。
  • mysqlnd 優勢:非阻塞、記憶體效率高、支援 mysqli::reap_async_query 等進階功能,生產環境首選。

一鍵修腳本(適用 5.6/5.7)

#!/bin/bash
# fix_old_password.sh
USER=$1
PASS=$2
mysql -e "UPDATE mysql.user SET Password=PASSWORD('$PASS') WHERE User='$USER'; FLUSH PRIVILEGES;"
sed -i 's/^old_passwords.*/old_passwords=0/' /etc/my.cnf
systemctl restart mysqld
copyright © 萬盛學電腦網 all rights reserved