java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
at com.mysql.jdbc.SQLError.createSQLException...
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection...
| 項目 | 開發環境 (正常) | 部署環境 (報錯) |
|---|---|---|
| OS | Windows 7 64位 | Windows Server 32位 |
| MySQL 版本 | 5.6.14 64位 | 5.6.31 32位 |
| 字符集 | Server/DB/Client 均 utf8 | Server/DB latin1, Client gbk |
| JDBC URL | jdbc:mysql://127.0.0.1:3306/lgs?useUnicode=true&characterEncoding=UTF-8 | 同左 |
| 用戶/密碼 | root/admin | root/admin |
部署環境 MySQL `root` 用戶僅授權 `localhost`,而 JDBC URL 使用 `127.0.0.1`(TCP 連接),MySQL 將其視為 `root@127.0.0.1`,與 `root@localhost` (Socket 連接) 權限分離,導致拒絕訪問。
-- 查看用戶授權
SELECT User, Host FROM mysql.user WHERE User='root';
-- 可能輸出
+------+-----------+
| User | Host |
+------+-----------+
| root | localhost |
| root | 127.0.0.1 | -- 缺少這行或密碼不同
+------+-----------+
部署環境 Server/DB 為 `latin1`,Client 為 `gbk`,JDBC 指定 `characterEncoding=UTF-8`,三端編碼衝突可能導致握手階段認證信息解析錯誤,表現為 Access denied。
mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'admin' WITH GRANT OPTION;
FLUSH PRIVILEGES;
或通配符授權(不推薦生產):`'root'@'%'`
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
jdbc:mysql://localhost:3306/lgs?useUnicode=true&characterEncoding=UTF-8
需確保 MySQL `skip-networking` 未開啟,且 `root@localhost` 密碼正確。
提問者反饋:「嘗試了各種方法,最好重裝了一個 MySQL server,搞定」。重裝過程中默認初始化了 `root@%` 或 `root@127.0.0.1` 授權,且字符集可選 utf8mb4,從而繞過上述所有坑。