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)。