萬盛學電腦網

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

MySQL 客戶端不支持認證協議?新舊密碼協議不兼容完整解決方案

報錯現象

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

MySQL 4.1+ 採用 41 位雜湊(mysql_native_password),舊客戶端(4.1 前)僅支持 16 位雜湊(mysql_old_password)。

四大解決方案(按推薦度排序)

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

  • PHP:升級至 5.3+,使用 mysqli 或 PDO_MySQL(原生支持新協議)。
  • Java:升級 Connector/J 至 5.1+。
  • Python:升級 mysqlclient / PyMySQL 至最新版。
  • C/C++:鏈接新版 libmysqlclient。

方案二:為舊客戶端賬號設置舊格式密碼(過渡)


-- 單用戶設置
SET PASSWORD FOR 'legacy_user'@'%' = OLD_PASSWORD('newpass');

-- 批量設置
UPDATE mysql.user SET Password = OLD_PASSWORD('newpass') WHERE User = 'legacy_user';
FLUSH PRIVILEGES;

方案三:全局啟用舊密碼協議(--old-passwords)

  1. 配置文件 [mysqld] 添加 old_passwords=1(或 default_authentication_plugin=mysql_old_password 5.7+)。
  2. 重啟服務。
  3. 對所有 Password 長度 > 16 的賬號重置為舊格式:
    SELECT Host, User FROM mysql.user WHERE LENGTH(Password) > 16;
    逐個執行 SET PASSWORD FOR 'user'@'host' = OLD_PASSWORD('newpass');

方案四:PHP 專項 — 改用 mysqli/PDO(強烈建議)

PHP 5.0+ 引入 mysqli(MySQL Improved),完美支持新協議、預處理語句、多語句執行、事務控制。**棄用古老的 mysql_* 擴展**。

驗證協議模式


SELECT PASSWORD('test');
-- 新協議:以 * 開頭的 41 位字符
-- 舊協議:16 位十六進制字符

生產環境遷移路線圖

  1. 盤點所有連接 MySQL 的應用與客戶端版本。
  2. 優先升級應用端驅動/庫(長期收益最大)。
  3. 無法升級的舊系統,單獨設置舊格式密碼(方案二)。
  4. 制定時間表,最終全網禁用 old_passwords,強制 caching_sha2_password(8.0 默認)。
copyright © 萬盛學電腦網 all rights reserved