MySQL 8.0+ 连接失败主因是驱动未升级:必须用 mysql-connector-j-8.x(非5.x),驱动类名改为 com.mysql.cj.jdbc.Driver,并补全 serverTimezone、characterEncoding、useSSL、allowPublicKeyRetrieval 等连接参数。

直接换驱动 + 补全连接参数,别在服务端硬切认证插件上兜圈子——MySQL 8.0+ 连不上,90% 是因为还在用 mysql-connector-java-5.x.jar 或 com.mysql.jdbc.Driver,这两个在 8.0+ 里已彻底删除,不是“不推荐”,是根本不存在。
驱动类名和 JAR 包必须同步更新
老项目里写死的 Class.forName("com.mysql.jdbc.Driver") 或配置文件中的 driver-class-name: com.mysql.jdbc.Driver,启动时直接抛 ClassNotFoundException。这不是 classpath 没加对,是这个类在 mysql-connector-java-8.x.x.jar 里压根没定义。
- 删掉所有
mysql-connector-java-5.1.x.jar(或任何 5.x 版本) - Maven 依赖换成:
<dependency><groupid>mysql</groupid><artifactid>mysql-connector-j</artifactid><version>8.3.0</version></dependency>(注意:8.3.0+ 推荐用mysql-connector-j,不是mysql-connector-java) - 代码和配置中所有
com.mysql.jdbc.Driver替换为com.mysql.cj.jdbc.Driver - Spring Boot 2.1+ 默认带 8.x 驱动,但若你在
pom.xml中用<exclusions></exclusions>排除了它又手动引入了 5.x,照样踩坑
连接串缺参数会导致“能连不能查”
只改驱动类名还不够。应用能启动、DataSource 创建成功,但第一次执行 SELECT 就卡住、返回空结果,日志里可能只有模糊的 SQLNonTransientConnectionException——这是 MySQL 8.0 驱动默认强制校验服务端时区,而旧连接串没声明。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
-
serverTimezone必须显式指定,不能留空或依赖系统默认值;UTC虽可通,但业务时间逻辑易出错,建议用实际部署时区如Asia/Shanghai -
characterEncoding=utf8要加上:虽然 MySQL 8.0 默认用utf8mb4,但不加此参数,某些字符串操作会触发Incorrect string value -
useSSL=false在开发环境必须加;生产环境应配证书并设为true -
allowPublicKeyRetrieval=true是 8.0.4+ 新增必要参数,否则可能卡在 RSA 密钥交换阶段 - 完整示例:
jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true(注意 XML/properties 中&要转义)
别只盯着 caching_sha2_password,先确认是不是驱动根本没加载
看到 ERROR 1251 或 Authentication plugin 'caching_sha2_password' cannot be loaded,第一反应不该是改用户认证方式,而是检查驱动是否真被加载了。很多报错其实发生在握手前——驱动连协议协商都没开始就失败了。
- 检查 JVM 启动日志,确认
mysql-connector-j-8.x.x.jar真正进了 classpath,且没有多个版本冲突 - 如果用的是 Tomcat,确认
lib目录下没残留mysql-connector-java-5.1.x.jar,旧版会优先被加载 - Java 应用里调用
Class.forName("com.mysql.cj.jdbc.Driver")已非必需(新驱动通过 SPI 自动注册),手动加载反而可能触发警告甚至干扰初始化顺序 - Navicat / DBeaver 等 GUI 工具需单独升级内置驱动或切换连接类型;老版 Navicat 12 不支持
caching_sha2_password,但换驱动比改服务端更可控
最容易被忽略的是:驱动不升级,只调服务端参数,会在长连接复用、连接池回收等场景偶发握手失败。这不是一次性的连接问题,而是协议层不匹配导致的间歇性故障,日志里往往没明确报错,只能靠抓包或观察连接池行为定位。


















