目录
[5 MySQL驱动类选择与数据库连接 URL 时区配置](#5 MySQL驱动类选择与数据库连接 URL 时区配置)
[5.1 MySQL 驱动类(driver-class-name)选择](#5.1 MySQL 驱动类(driver-class-name)选择)
[5.2 数据库连接 URL 时区配置](#5.2 数据库连接 URL 时区配置)
[5.3 字符编码配置](#5.3 字符编码配置)
[5.4 总结](#5.4 总结)
5 MySQL驱动类选择与数据库连接 URL 时区配置
正确且规范的示例:application.yml(SpringBoot2.7.6,MySQL80)
spring:
# 配置数据源信息
datasource:
# 配置数据源类型
type: com.zaxxer.hikari.HikariDataSource
# 配置连接数据库信息
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: '036520'
5.1 MySQL 驱动类(driver-class-name)选择
- Spring Boot 版本与驱动类对应关系
- Spring Boot 2.0 及以下(内置 MySQL 5.x 驱动):
驱动类使用com.mysql.jdbc.Driver,也就是application.yml里的driver-class-name写的是com.mysql.jdbc.Driver。 - Spring Boot 2.1 及以上(内置 MySQL 8.x 驱动):
驱动类使用com.mysql.cj.jdbc.Driver,也就是application.yml里的driver-class-name写的是com.mysql.cj.jdbc.Driver。 - 若不匹配,运行时会出现 WARN 警告信息。

翻译:"正在加载类com.mysql.jdbc.Driver,这已被弃用。新的驱动类是com.mysql.cj.jdbc.Driver。驱动会通过 SPI(服务提供程序接口)自动注册,通常不需要手动加载驱动类。"
虽然警告,但是不影响代码的运行。
警告原因:你当前用的是com.mysql.jdbc.Driver(旧驱动类),但项目里实际依赖的是 MySQL 8.x 驱动 jar 包(对应新驱动类com.mysql.cj.jdbc.Driver),旧类已被 8.x 驱动标记为 "过时(deprecated)",所以触发警告。
测试成功原因:8.x 驱动为了兼容旧代码,保留了com.mysql.jdbc.Driver类的 "占位实现"------ 它会自动转发到新驱动类com.mysql.cj.jdbc.Driver执行逻辑。因此虽然报了警告,但实际驱动功能仍能正常工作。 - 总结:是否带cj取决于 MySQL 驱动 jar 包版本
- 5.x 驱动 jar 包 → com.mysql.jdbc.Driver
- 8.x 驱动 jar 包 → com.mysql.cj.jdbc.Driver
-
com.mysql:mysql-connector-j(或旧坐标mysql:mysql-connector-java)的版本 ,它决定了驱动是 5.x 还是 8.x。
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
注:不需要声明版本号,SpringBoot会自动导入。spring-boot-starter-parent(比如 2.7.6),它会管理第三方依赖的默认版本(包括 MySQL 驱动)。

mysql-connector-j(或mysql-connector-java)的版本号:
- 版本号以5.开头(比如5.1.49)→ 是 5.x 驱动,对应驱动类com.mysql.jdbc.Driver;
- 版本号以8.开头(比如8.0.31)→ 是 8.x 驱动,对应驱动类com.mysql.cj.jdbc.Driver。
- 驱动和MySQL的兼容性
SpringBoot 2.0(内置 5.x 驱动)连接 MySQL 8.0,大部分场景可以运行,但有兼容性风险,因为 5.x 驱动是为 MySQL 5.x 设计的,对 MySQL 8.0 的新特性(比如密码加密方式)支持不足:
- 可能遇到的问题:
- 比如 MySQL 8.0 默认密码加密方式是caching_sha2_password,而 5.x 驱动不支持,会报 "Authentication plugin 'caching_sha2_password' cannot be loaded" 错误。
- 解决办法(不推荐):
- 把 MySQL 8.0 的密码加密方式改成旧的mysql_native_password,但这会降低安全性。
总的来说: - ✅ 同大版本:5.x 驱动 → MySQL 5.x(完美适配);8.x 驱动 → MySQL 8.x(完美适配)
- ✅ 高版本驱动→低版本数据库:8.x 驱动 → MySQL 5.x(向下兼容,无问题)
- ⚠️ 低版本驱动→高版本数据库:5.x 驱动 → MySQL 8.x(有兼容性风险,不推荐)
5.2 数据库连接 URL 时区配置
- MySQL 版本与 URL 时区要求
- MySQL 5.7 版本 URL:无需指定时区
jdbc:mysql://localhost:3306/数据库名?characterEncoding=utf-8&useSSL=false - MySQL 8.0 版本 URL:必须指定时区(否则报The server time zone value'XXX' is unrecognized错误)
jdbc:mysql://localhost:3306/数据库名?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
(GMT%2B8即东八区,也可写Asia/Shanghai)
- 特殊情况说明
- 若使用 MySQL 8.0 驱动(8.x jar 包)+ MySQL 8.0 服务器,且服务器 / 系统时区为东八区,驱动会自动适配时区,URL 不加时区也可能不报错,但规范开发仍建议显式指定。
- 项目(比如SSM、SpringBoot )若用 5.x 驱动连接 MySQL 8.0,必须手动加时区,不然会报错。
5.3 字符编码配置
无论 MySQL 5.7 还是 8.0,URL 中建议添加字符编码参数保证中文兼容:
- characterEncoding=utf-8 或 useUnicode=true&characterEncoding=utf-8
- MySQL 8.0 默认字符集为utf8mb4,8.x 驱动已默认适配,但显式指定可避免环境差异导致的乱码。
5.4 总结
- 驱动 jar 包版本决定驱动类(是否带cj)和时区自动适配能力:
- 5.x 驱动:无自动时区适配,MySQL 8.0 必须手动加时区,驱动类用com.mysql.jdbc.Driver
- 8.x 驱动:可自动读取服务器 / 系统时区,驱动类用com.mysql.cj.jdbc.Driver
- MySQL 服务器版本决定 URL 时区配置的 "硬性要求":
- MySQL 5.7:无需时区参数
- MySQL 8.0:规范配置需加时区参数(避免跨环境报错)