5 MySQL驱动类选择与数据库连接 URL 时区配置

目录

[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)选择

  1. 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
  1. 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。
  1. 驱动和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 时区配置

  1. 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)
  1. 特殊情况说明
  • 若使用 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 总结

  1. 驱动 jar 包版本决定驱动类(是否带cj)和时区自动适配能力:
  • 5.x 驱动:无自动时区适配,MySQL 8.0 必须手动加时区,驱动类用com.mysql.jdbc.Driver
  • 8.x 驱动:可自动读取服务器 / 系统时区,驱动类用com.mysql.cj.jdbc.Driver
  1. MySQL 服务器版本决定 URL 时区配置的 "硬性要求":
  • MySQL 5.7:无需时区参数
  • MySQL 8.0:规范配置需加时区参数(避免跨环境报错)
相关推荐
逍遥德2 小时前
怎样跨过PostgreSQL性能专家的门槛
数据库·sql·postgresql·数据分析
我不听你讲话4 小时前
关系型与非关系型数据库视角下的 MySQL:特性解析与 Linux 部署实践
linux·mysql·nosql
prince058 小时前
用户积分系统怎么设计
java·大数据·数据库
原来是猿10 小时前
MySQL【内置函数】
数据库·mysql
難釋懷10 小时前
Redis分片集群插槽原理
数据库·redis·缓存
冷小鱼10 小时前
pgvector 向量数据库完全指南:PostgreSQL 生态的 AI 增强
数据库·人工智能·postgresql
陈天伟教授10 小时前
人工智能应用- 天文学家的助手:08. 星系定位与分类
前端·javascript·数据库·人工智能·机器学习
yunyun3212310 小时前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
m0_6625779710 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python