MySQL 5.7 重大變更:mysql.user 表移除 password 欄位,改用 authentication_string 儲存加密密碼。本文提供標準修改流程與常見坑點。
# 1. 登入 MySQL
mysql -u root -p
# 2. 更新密碼 (替換 '新密碼' 與 '用戶名')
UPDATE mysql.user
SET authentication_string = PASSWORD('新密碼')
WHERE User = '用戶名' AND Host = 'localhost';
# 3. 刷新權限生效
FLUSH PRIVILEGES;
# 4. 退出驗證
QUIT;
# 重新登入測試
mysql -u 用戶名 -p'新密碼'
# 修改 root 密碼 mysqladmin -u root -p'舊密碼' password '新密碼' # 若 root 無密碼 (初始安裝) mysqladmin -u root password '新密碼'
| 項目 | 5.6 及之前 | 5.7+ |
|---|---|---|
| 密碼欄位名 | Password (CHAR(41)) | authentication_string (TEXT) |
| 加密函數 | PASSWORD() → 41 字元雜湊 | PASSWORD() → 同樣邏輯,但存入 TEXT |
| 驗證外掛 | mysql_native_password | 預設 mysql_native_password,支援 caching_sha2_password (8.0 預設) |
| FLUSH PRIVILEGES | 必要 | 必要 |
| 錯誤現象 | 原因 | 解決 |
|---|---|---|
ERROR 1064: Unknown column 'password' | 仍用舊欄位名 | 改用 authentication_string |
| 修改後無法登入 | Host 不匹配 (如 '%' vs 'localhost') | WHERE 子句精確匹配 User+Host |
| FLUSH PRIVILEGES 忘記執行 | 權限快取未更新 | 必須執行 FLUSH PRIVILEGES |
| PASSWORD() 回傳 NULL | 引數為 NULL 或空字串 | 確保傳入非空字串 |
caching_sha2_password,PASSWORD() 函數已移除。ALTER USER 'user'@'host' IDENTIFIED BY 'newpass'; # 或 SET PASSWORD FOR 'user'@'host' = 'newpass';
ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'newpass';
UPDATE mysql.user SET Host='localhost' WHERE User='root';mysql.user 表結構與資料,防誤操作。SELECT User, Host, authentication_string FROM mysql.user WHERE User='root'; +------+-----------+-------------------------------------------+ | User | Host | authentication_string | +------+-----------+-------------------------------------------+ | root | localhost | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | +------+-----------+-------------------------------------------+
掌握 authentication_string 變更,避免「明明改了密碼卻登不進去」的經典坑點。