1.權限問題
MySQL 認證協議不兼容問題解決方案
這個錯誤表明您的 MySQL 客戶端與服務器要求的認證協議不兼容,通常發生在 MySQL 8.0+ 服務器與舊版客戶端之間。
nested exception is org.apache.ibatis.exceptions.PersistenceException:
Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to
obtain JDBC Connection; nested exception is
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
Client does not support authentication protocol requested by server;
consider upgrading MySQL client ### The error may exist in
com/cai/mapper/StudentDao.xml ### The error may involve
com.cai.dao.StudentDao.search ### The error occurred while executing a
query ### Cause:
org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to
obtain JDBC Connection; nested exception is
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
Client does not support authentication protocol requested by server;
consider upgrading MySQL client
解決辦法:
方案1:升級 MySQL 客戶端(推薦)
更新 Maven/Gradle 依賴:
xml
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version> <!-- 使用最新穩定版 -->
</dependency>
更新 JDBC URL:
properties
spring.datasource.url=jdbc:mysql://localhost:3306/yourdb?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
方案2:修改 MySQL 用戶認證方式
如果暫時無法升級客戶端:
登錄 MySQL:
bash
mysql -u root -p
修改用戶認證插件:
sql
– 查看當前認證方式
SELECT user, host, plugin FROM mysql.user;
– 修改為舊版認證協議
ALTER USER 'your_username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
– 刷新權限
FLUSH PRIVILEGES;
或創建新用戶:
sql
CREATE USER 'legacy_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT ALL PRIVILEGES ON your_database.* TO 'legacy_user'@'%';
FLUSH PRIVILEGES;
方案3:修改 MySQL 服務器配置(不推薦)
在 my.cnf 或 my.ini 中添加:
ini
[mysqld]
default_authentication_plugin=mysql_native_password
然后重啟 MySQL 服務。
驗證步驟
檢查驅動版本是否更新:
java
System.out.println("MySQL驅動版本: " + com.mysql.cj.jdbc.Driver.class.getPackage().getImplementationVersion());
測試連接:
java
try (Connection conn = DriverManager.getConnection(
“jdbc:mysql://localhost:3306/test?user=root&password=yourpass”)) {
System.out.println(“連接成功!”);
}
2.字符集錯誤
這個錯誤是由于 ??MySQL 客戶端(JDBC 驅動)與服務器的字符集協商失敗?? 導致的。MySQL 服務器返回了一個客戶端無法識別的字符集索引(255,對應 utf8mb4),而舊版本 JDBC 驅動無法處理該索引。
nested exception is org.apache.ibatis.exceptions.PersistenceException:
Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to
obtain JDBC Connection; nested exception is java.sql.SQLException:
Unknown initial character set index ‘255’ received from server.
Initial client character set can be forced via the ‘characterEncoding’
property. ### The error may exist in com/cai/mapper/StudentDao.xml ###
The error may involve com.cai.dao.StudentDao.search ### The error
occurred while executing a query ### Cause:
org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to
obtain JDBC Connection; nested exception is java.sql.SQLException:
Unknown initial character set index ‘255’ received from server.
Initial client character set can be forced via the ‘characterEncoding’
property.
一、核心原因??
??字符集不兼容??:MySQL 8.0+ 服務器默認使用 utf8mb4 字符集(索引 255),但舊版本 JDBC 驅動(如 mysql-connector-java:5.x)不支持該字符集的索引。
??驅動版本過舊??:5.x 驅動僅支持 latin1、utf8(非 utf8mb4)等舊字符集,無法識別 utf8mb4 的索引 255。
??二、解決方案(分步操作)??
??1. 升級 MySQL JDBC 驅動到 8.x 版本??
MySQL 8.0+ 驅動(mysql-connector-java:8.x)已修復字符集協商問題,支持 utf8mb4 索引 255。
??Maven 項目??
修改 pom.xml 中的驅動版本(推薦 8.0.33+):
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency>
??Gradle 項目??
修改 build.gradle 中的驅動版本:
dependencies {implementation 'mysql:mysql-connector-java:8.0.33'
}
??2. 在 JDBC 連接 URL 中顯式指定字符集??
即使驅動版本正確,仍需在連接 URL 中添加 characterEncoding 參數,強制客戶端使用 utf8mb4 字符集(兼容服務器返回的索引 255)。
??修改后的連接 URL 示例??
jdbc:mysql://localhost:3306/your_database?useSSL=false& <!-- 禁用 SSL(可選,若服務器未強制) -->serverTimezone=Asia/Shanghai& <!-- 設置時區(避免時間戳錯誤) -->characterEncoding=utf8mb4& <!-- 顯式指定客戶端字符集為 utf8mb4 -->allowPublicKeyRetrieval=true <!-- 允許公鑰檢索(可選,增強認證兼容性) -->
3. 驗證 MySQL 服務器字符集配置??
登錄 MySQL 服務器,確認字符集配置是否與客戶端兼容:
– 查看服務器默認字符集(應為 utf8mb4)
SHOW VARIABLES LIKE 'character_set_server';
– 查看數據庫字符集(替換為你的數據庫名)
SHOW VARIABLES LIKE 'character_set_database';
若服務器未使用 utf8mb4,可手動修改(推薦):
– 修改服務器默認字符集(需重啟 MySQL 生效)
SET GLOBAL character_set_server = 'utf8mb4';
SET GLOBAL collation_server = 'utf8mb4_unicode_ci';
??4. 清理本地倉庫并重新構建??
舊版本驅動的緩存可能導致配置不生效,需清理本地 Maven/Gradle 倉庫:
??Maven 清理緩存??
刪除本地倉庫中 mysql-connector-java 的舊版本目錄(路徑示例):
~/.m2/repository/mysql/mysql-connector-java/5.1.x/
??Gradle 清理緩存??
刪除 ~/.gradle/caches 目錄,重新構建項目:
關閉 IDE,刪除緩存目錄
rm -rf ~/.gradle/caches
重新導入項目并構建
??三、常見問題排查??
??問題 1:驅動升級后仍報錯??
??原因??:驅動未正確加載,或連接 URL 未添加 characterEncoding 參數。
??解決??:
檢查 pom.xml 或 build.gradle 中驅動版本是否為 8.x(如 8.0.33)。
確認連接 URL 包含 characterEncoding=utf8mb4。
??問題 2:服務器字符集為 latin1 或其他非 utf8mb4??
??原因??:服務器使用舊字符集,與客戶端驅動不兼容。
??解決??:
修改服務器字符集為 utf8mb4(推薦):
– 修改服務器默認字符集(需重啟 MySQL)
SET GLOBAL character_set_server = ‘utf8mb4’;
SET GLOBAL collation_server = ‘utf8mb4_unicode_ci’;
或在連接 URL 中強制客戶端使用服務器支持的字符集(如 latin1):
jdbc:mysql://localhost:3306/your_database?characterEncoding=latin1
問題 3:時區或 SSL 配置沖突??
??原因??:useSSL 或 serverTimezone 參數錯誤導致連接失敗。
??解決??:
確保 useSSL=false(若服務器未強制 SSL)。
設置正確的時區(如 serverTimezone=Asia/Shanghai)。