Mysql报错

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值