萬盛學電腦網

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

MySQL 5.x 修改密碼後無法登入?舊密碼協議兼容性問題完美解決

現象與根因

MySQL 4.1.1+ 將密碼雜湊從 16 位升級為 41 位(以 * 開頭),採用新認證協議。舊版客戶端(如 PHP 4.x 自帶 libmysql.dll、舊版 JDBC/ODBC)不支持新協議,報錯:

#1250 - Client does not support authentication protocol requested by server; consider upgrading MySQL client

官方兩大解決路徑

路徑一:升級客戶端庫(首選,但可能受限)

替換應用依賴的客戶端庫為 4.1.1+ 版本。實踐中常遇阻礙:
• PHP php_mysql.dll 依賴 libmysql.dll,新版 DLL 可能缺少 mysql_drop_db() 等函數導致加載失敗。
• 需等待 PHP 或連接器官方發布兼容版本。

路徑二:強制服務端使用舊密碼格式(即時生效,推薦過渡期使用)

臨時驗證:命令行啟動加參數

mysqld-nt --old-passwords

另開窗口測試 SELECT PASSWORD('test');,輸出應為 16 位雜湊(如 162eebfb6477e5d3)。

永久生效:修改配置文件

編輯 my.ini(Windows 通常在 C:\Windows\my.ini 或 C:\WINNT\my.ini),[mysqld] 區塊添加:

[mysqld]
basedir=C:/mysql
datadir=C:/mysql/data
set-variable=old-passwords

重啟服務生效。

根治:將 user 表 password 列長度改回 16 字符

ALTER TABLE mysql.user MODIFY Password CHAR(16);
UPDATE mysql.user SET Password=OLD_PASSWORD('newpass') WHERE User='root';
FLUSH PRIVILEGES;

系統會自動切換至舊認證模式。修改回 CHAR(41) 則切回新模式。切換後必須重新設置密碼並刷新權限。

最佳實踐建議

  1. 優先升級客戶端庫(PHP 升級至 5.3+ 使用 mysqli 或 PDO_MySQL,原生支持新協議)。
  2. 過渡期啟用 old-passwords,並制定遷移時間表。
  3. 新建賬號直接使用新協議,舊賬號漸進式遷移。
  4. 生產環境禁用 old-passwords,強制使用 SHA-256 加密(caching_sha2_password,5.7+/8.0 默認)。
copyright © 萬盛學電腦網 all rights reserved