如何解决MySQL 8.0无法使用旧版驱动连接_通过更新Connector/J驱动

P粉602998670

P粉602998670

2026-05-29

571人浏览

原创

mysql 8.0+ 彻底弃用 com.mysql.jdbc.driver,必须升级驱动至 mysql-connector-java-8.x.x.jar 并将类名改为 com.mysql.cj.jdbc.driver,同时连接串需补全 servertimezone、characterencoding、usessl=false 和 allowpublickeyretrieval=true 等参数。

如何解决mysql 8.0无法使用旧版驱动连接_通过更新connector/j驱动

com.mysql.jdbc.Driver 报 ClassNotFoundException 就是驱动没换对

MySQL 8.0 彻底弃用了 com.mysql.jdbc.Driver,老项目里硬编码或配置文件中还写这个类名,启动时直接抛 ClassNotFoundException。这不是类路径没加对,而是这个类在 mysql-connector-java-8.x.x.jar 里根本不存在了。

检查你项目里的 JDBC 驱动 JAR 文件名:mysql-connector-java-5.1.49.jar 或类似 5.x 版本必须全部替换成 mysql-connector-java-8.0.33.jar(或更高,如 8.3.x);Maven 依赖要删掉旧版,加上:

<dependency><groupid>mysql</groupid><artifactid>mysql-connector-java</artifactid><version>8.3.0</version></dependency>
  • Spring Boot 2.1+ 默认带 8.x 驱动,但若你在 pom.xml 中显式 <exclusions></exclusions> 掉了它,又手动引入了 5.x,照样报错
  • 代码里调用 Class.forName("com.mysql.jdbc.Driver") 的地方,必须改成 Class.forName("com.mysql.cj.jdbc.Driver")
  • 配置文件(如 application.yml)中的 driver-class-name: com.mysql.jdbc.Driver 同样要改

连接串缺 serverTimezone 导致启动不报错但查不出数据

只改驱动类名还不够。mysql-connector-java-8.x 默认强制校验服务端时区,而 MySQL 5.7 时代很多连接串只写 ?useSSL=false,到了 8.0 就会静默失败——应用能启动、连接对象创建成功,但第一次执行 SELECT 就卡住或返回空结果,日志里可能只有模糊的 SQLNonTransientConnectionException

完整连接参数必须包含时区和字符集声明:

jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
  • serverTimezone 必须显式指定,不能留空或用系统默认值;UTC 虽可通,但业务时间逻辑容易出错,建议用实际部署时区如 Asia/Shanghai
  • characterEncoding=utf8 是为了兼容老 SQL 模板,虽然 MySQL 8.0 默认用 utf8mb4,但驱动不加此参数可能在某些字符串操作中触发 Incorrect string value
  • useSSL=false 在开发环境必须加;生产环境应配证书并设为 true,否则连接可能被拒绝
  • allowPublicKeyRetrieval=true 是 8.0.4+ 强制要求,否则 RSA 密钥交换阶段会直接中断

caching_sha2_password 认证失败不是数据库配错了

连上就报 Authentication plugin 'caching_sha2_password' cannot be loadedPublic Key Retrieval is not allowed,别急着去 MySQL 里执行 ALTER USER ... IDENTIFIED WITH mysql_native_password。这说明驱动版本是对的,但认证流程卡在插件协商环节。

MySQL(Linux)
MySQL(Linux)

MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。

下载

根本原因:旧版客户端(比如 DBVisualizer 自带的老驱动、某些 IDE 内置数据库工具)即使用了 8.x JAR,也可能未启用新认证协议支持。此时关键不是改数据库用户,而是确认驱动行为:

  • 确保连接 URL 中已含 allowPublicKeyRetrieval=true —— 缺这个参数,caching_sha2_password 握手无法完成
  • 如果仍失败,且你确定不能升级客户端工具(如固定版本的 Navicat),才考虑临时改用户插件:ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';
  • 云数据库(如阿里云 RDS、腾讯云 CDB)通常不允许执行 ALTER USER ... IDENTIFIED WITH,这时唯一解法就是升级客户端驱动或换工具

cachePrepStmts 和 prepStmtCacheSize 影响 MyBatis 动态 SQL 执行

应用启动成功、查询单条记录也正常,但一跑分页或 IN (?, ?, ?...) 列表就报错或返回空,常见于 MyBatis 场景。这不是 SQL 写错了,而是 Connector/J 8.x 对预编译语句缓存策略变了。

老驱动默认开启 cachePrepStmts=true,新驱动在未显式配置时会禁用缓存,导致部分动态 SQL 回退到非预编译模式,触发权限限制或语法不兼容(比如长 IN 列表被截断)。

补上这两项参数能稳定行为:

&cachePrepStmts=true&prepStmtCacheSize=250&prepStmtCacheSqlLimit=2048
  • cachePrepStmts=true 显式启用缓存
  • prepStmtCacheSize=250 设合理大小,避免频繁重建 PreparedStatement
  • prepStmtCacheSqlLimit=2048 确保较长的动态 SQL(如多条件拼接的 WHERE)也能进缓存
  • 不加的话,MyBatis 的 <foreach></foreach>、JPA 的批量插入等都可能异常

真正麻烦的从来不是换一个 JAR 或改一行配置,而是多个参数必须同时生效——少一个,错误现象就变个样,排查时容易误判方向。尤其当项目混用多种数据库工具(IDE 内置、DBVisualizer、命令行)时,每个工具的驱动版本和连接参数都得单独核对。

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

mysql mysql 8.0

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

1376

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

1562

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

692

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

551

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

910

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

1128

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

1685

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

5680

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

420

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 125人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 224人学习

phpEnv手册
phpEnv手册

共0课时 | 0人学习