MySQL 8.0+ 连接失败主因是驱动类名未更新为com.mysql.cj.jdbc.Driver、连接串缺serverTimezone、characterEncoding、useSSL=false和allowPublicKeyRetrieval=true等必要参数。

MySQL 8.0+ 连不上?大概率是 com.mysql.jdbc.Driver 被弃用了
MySQL 5.7 及更早版本默认用 com.mysql.jdbc.Driver,但 8.0 开始官方 JDBC 驱动(MySQL Connector/J)彻底切换到 com.mysql.cj.jdbc.Driver。如果你升级了 MySQL 服务端却没换驱动 JAR,启动时会报 ClassNotFoundException 或连接后立刻断开,日志里常带 Unknown system variable 'query_cache_size'——这不是配置错了,是老驱动试图用旧协议跟新服务端握手失败。
- 检查项目 classpath 中的 JAR 名:必须是
mysql-connector-java-8.x.x.jar(不是mysql-connector-java-5.1.x.jar) - Spring Boot 用户注意:
spring-boot-starter-jdbc2.1+ 默认带 8.x 驱动,但若显式排除了它又手动引入了 5.x,照样踩坑 - Driver 类名必须更新:代码或配置里所有
com.mysql.jdbc.Driver全部替换成com.mysql.cj.jdbc.Driver
连接串加了 ?serverTimezone=UTC 还报时区错?少写了 &characterEncoding=utf8
MySQL 8.0 默认字符集是 utf8mb4,且强制校验时区。只加 serverTimezone 不够,老连接串缺关键参数会导致连接成功但执行 SQL 时报 Incorrect string value 或 The server time zone value 'XXX' is unrecognized。
- 完整推荐连接参数:
?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true -
useSSL=false不是可选:8.0 默认要求 SSL,本地开发不配证书就必加;生产环境应配证书并设为true -
allowPublicKeyRetrieval=true是 8.0.4+ 新增必要参数,否则可能卡在 RSA 密钥交换阶段 - 注意 URL 里的
&是 HTML 实体,在 XML/properties 文件中要写成&,否则解析失败
应用启动不报错但查不出数据?检查 cachePrepStmts 和 prepStmtCacheSize
MySQL 8.0 对预编译语句缓存更敏感,老驱动默认开启 cachePrepStmts=true,但新驱动在未显式配置缓存大小时会降级为禁用,导致某些 ORM(如 MyBatis)动态 SQL 执行异常或返回空结果。
- 加上这两项能稳住行为:
&cachePrepStmts=true&prepStmtCacheSize=250&prepStmtCacheSqlLimit=2048 - 不加的话,部分分页查询、
IN列表过长的语句可能被拒绝预编译,回退到普通语句执行,触发权限或语法兼容问题 - Spring Boot 的
spring.datasource.hikari.data-source-properties下配这些参数时,值要加引号,否则 YAML 解析会把true当布尔型丢掉
用 HikariCP 连接池时 connection-test-query 报错?别用 SELECT 1
HikariCP 旧配置习惯写 connection-test-query=SELECT 1,但在 MySQL 8.0+ 上,这个语句不走连接验证流程,池子可能返回已失效连接,后续业务查不到数据也不报错。
- 必须改成
connection-test-query=SELECT 1 FROM DUAL或直接用isValid()(HikariCP 3.3.1+ 默认启用) - 更稳妥的是关掉测试查询,改用
connection-timeout+validation-timeout组合,避免额外网络往返 - 如果用了
test-on-borrow(非 HikariCP 原生参数),说明你混用了其他连接池配置,得清掉
最麻烦的不是配错,而是错误沉默——连得上、不报错、但数据不对。务必在升级后跑一遍真实业务 SQL,别只看连接池初始化日志。



















