首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP 5 連接 MySQL 4.1+ 認證協議不匹配問題:四大解決方案對比

     編輯:MySQL 資料庫相關知識

問題根因

MySQL 4.1 引入雙重 SHA1 雜湊認證協議(`mysql_native_password`),舊版客戶端(含 PHP 5 早期 `mysql`/`mysqli` 擴展)僅支援單次 SHA1 舊協議,連接新版庫報錯:

Client does not support authentication protocol requested by server

官方四大解決路徑

方案 1:升級客戶端庫(根治)

  • PHP 5.3+ 內建 `mysqlnd` (MySQL Native Driver) 完美支援新協議。
  • 舊版 PHP 需重新編譯或更新 `libmysql.dll`,維護成本高,**推薦升級 PHP 版本**。

方案 2:使用舊協議帳號(繞過)

  • 僅能用 MySQL 4.1 前建立的舊帳號連接,新建帳號預設新協議,無法用此法。

方案 3:將特定帳號密碼重置為舊格式(推薦折中)

-- SQL 方式
SET PASSWORD FOR 'user'@'host' = OLD_PASSWORD('newpass');
-- 或
UPDATE mysql.user SET Password = OLD_PASSWORD('newpass') WHERE User='user' AND Host='host';
FLUSH PRIVILEGES;
  • 該帳號改用舊雜湊,舊客戶端可連接,**新協議優勢(更安全雜湊)對該帳號失效**。
  • 適配舊系統無法升級客戶端的場景。

方案 4:服務端全局強制舊雜湊(不推薦)

mysqld --old-passwords
  • 所有新建帳號預設舊格式,**全系統降級安全性**,僅作臨時過渡。

方案 5:批量修正已遷移帳號

SELECT Host, User, Password FROM mysql.user WHERE LENGTH(Password) > 16;
-- 對每個帳號執行方案 3 的 OLD_PASSWORD() 重置

最佳實踐建議

  1. 優先升級 PHP 至 5.3+ / 7.x / 8.x,使用 `mysqli` 或 `PDO_MySQL` + `mysqlnd`,原生支援新協議、預處理、多語句、事務控制。
  2. 若被迫維護舊 PHP,對**專用應用帳號**單獨執行 `OLD_PASSWORD()` 重置,主帳號/管理帳號保持新協議。
  3. 嚴禁生產環境長期開啟 `--old-passwords`。
  4. 連接字串建議顯式指定 SSL:`mysqli::ssl_set()` 或 PDO `MYSQL_ATTR_SSL_CA`,提升傳輸層安全。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved