MySQL升级后旧版JDBC驱动不兼容连接异常解决方法
升级到 MySQL 8.0+ 之后连不上?十有八九不是数据库配置的问题,而是客户端这边还在用老一套——驱动类和连接参数都没跟上协议的变化。这个问题在社区里已经被问烂了,但真正处理起来,还是得一步步把几个关键点理清楚。 MySQL 8.0+ 连接失败,90% 的根源是还在用 mysql-connect
升级到 MySQL 8.0+ 之后连不上?十有八九不是数据库配置的问题,而是客户端这边还在用老一套——驱动类和连接参数都没跟上协议的变化。这个问题在社区里已经被问烂了,但真正处理起来,还是得一步步把几个关键点理清楚。

MySQL 8.0+ 连接失败,90% 的根源是还在用 mysql-connector-java-5.x 驱动,或者没改连接参数——数据库本身没毛病,是客户端的协议和认证方式已经不兼容了。
com.mysql.jdbc.Driver 报 ClassNotFoundException 怎么办
这个类在 MySQL 8.0+ 的驱动里已经彻底消失了。如果你老项目里硬编码了 com.mysql.jdbc.Driver,或者 application.yml、db.properties 里写了它,必须全部替换成 com.mysql.cj.jdbc.Driver。
- 检查 classpath 下的 JAR 文件名:必须是
mysql-connector-java-8.x.x.jar或mysql-connector-j-8.x.x.jar(8.3.0+ 推荐),不能拿mysql-connector-java-5.1.49.jar这种糊弄 - Maven 依赖要彻底删掉旧版,换成:
mysql
mysql-connector-j
8.3.0 - 代码里
Class.forName("com.mysql.jdbc.Driver")那种老写法,直接删掉——新驱动通过 SPI 自动注册,手动加载反而可能触发警告,画蛇添足
连接成功但查不出数据或报时区/字符集错
只换驱动类名远远不够。MySQL 8.0 默认强制校验时区、默认用 utf8mb4、默认要求 SSL,老连接串缺参数会导致静默失败:应用能启动,Connection 对象也能创建,但第一次 executeQuery 就卡住或返回空结果,排查起来很头疼。
- 完整连接 URL 至少要带这四个参数:
serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true serverTimezone不能留空或随手写个UTC完事——业务时间逻辑依赖本地时区,用Asia/Shanghai更稳妥characterEncoding=utf8不是可选:虽然 MySQL 8.0 默认是utf8mb4,但驱动不声明的话,某些中文字段会被截断,甚至报Incorrect string valueuseSSL=false在开发环境必须加;生产环境应配证书并设为true,否则连接可能被拒绝,安全扫描也会报警allowPublicKeyRetrieval=true是 8.0.4+ 强制要求的,否则 RSA 密钥交换阶段就直接卡死
MyBatis 分页/IN 查询失效或返回空结果
这不是 SQL 写错了,是预编译语句缓存行为变了。老驱动默认开启 cachePrepStmts=true,新驱动不显式配置缓存大小时会降级为禁用,导致 ORM 动态 SQL 回退成普通语句执行,触发权限限制或语法不兼容。
- 在连接 URL 里补上:
&cachePrepStmts=true&prepStmtCacheSize=250&prepStmtCacheSqlLimit=2048 - 尤其影响
IN (, , ...)列表过长、LIMIT ,分页等场景,不加可能直接返回空集合,测试时很难察觉 - Spring Boot 用户注意:
spring-boot-starter-jdbc2.1+ 虽默认带 8.x 驱动,但如果你用把它排除了又手动引入了 5.x,照样掉坑
连得上但报 Plugin caching_sha2_password could not be loaded
这是 MySQL 8.0 默认认证插件变更导致的。JDBC 5.x、旧版 Navicat、DBeaver 等客户端根本不认识 caching_sha2_password,哪怕驱动和 URL 都对,也会在登录阶段被拒。
- 最稳方案:给对应用户切回旧插件:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES; - 不建议改
my.cnf的default_authentication_plugin:只影响新用户,已存在的用户不会自动更新,且重启服务有风险 - 别信"加个
allowPublicKeyRetrieval=true就能绕过"的说法——它解决的是密钥交换问题,不是认证插件不识别问题
真正麻烦的点不在驱动换没换,而在于每个参数改动都可能引发连锁反应:比如 useSSL=false 解决了连接,却让某些安全扫描工具直接标红;serverTimezone=Asia/Shanghai 解决了时间错乱,但在跨时区部署时又得动态切换。这些细节不写进配置、不验证到真实查询,光靠启动日志是看不出问题的。
