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

MySQL 5.x 密碼修改後無法登錄問題解決方案

     編輯:MySQL 資料庫相關知識

MySQL 4.1.1 版本起引入 41 位雜湊密碼格式,導致舊版客戶端(如 PHP 4.x 自帶 libmysql.dll)無法認證,報錯:

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

問題根因

  • MySQL 5.x 默認使用 mysql_native_password 插件(41 位雜湊)
  • 舊客戶端僅支援 16 位 old_password 格式
  • PHP 擴展 php_mysql.dll 綁定舊版 libmysql.dll,缺少新認證協議支持

兩種解決路徑

方案一:升級客戶端庫(推薦長期方案)

  1. 從 MySQL 5.x 安裝目錄複製 libmysql.dll 替換 PHP ext 目錄下同名文件
  2. 重啟 Apache/IIS 生效
  3. 風險:新版 DLL 可能缺少 mysql_drop_db() 等廢棄函數,導致 PHP 啟動報錯

方案二:強制服務端使用舊密碼格式(快速修復)

臨時驗證

C:\mysql\bin> mysqld-nt --old-password
# 另開窗口測試
C:\mysql\bin> mysql -uroot
mysql> SELECT PASSWORD('mypassword');
+------------------------+
| 162eebfb6477e5d3       |  <-- 16位舊格式
+------------------------+

永久生效配置

編輯 my.ini(Windows 通常在 C:\Windows\my.ini 或安裝目錄):

[mysqld]
basedir=C:/mysql
datadir=C:/mysql/data
old_passwords=1  # 關鍵參數

重啟 MySQL 服務生效。

底層機制補充

mysql.user 表 Password 列長度決定認證模式:

  • 16 字符 → old_password 模式
  • 41 字符(以 * 開頭)→ mysql_native_password 模式

修改密碼後務必執行 FLUSH PRIVILEGES 或重啟服務使權限生效。

現代最佳實踐

  1. 升級 PHP 至 7.2+,使用 mysqli 或 PDO_MySQL 擴展(基於 mysqlnd 原生驅動)
  2. MySQL 8.0 默認 caching_sha2_password,客戶端需 8.0+ 版本
  3. 避免在生產環境使用 old_passwords=1,存在安全隱患
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved