mysql 8.0 连不上主因是驱动类名未更新为com.mysql.cj.jdbc.driver、jar包仍用5.x版本,且连接串缺失servertimezone、characterencoding、usessl=false和allowpublickeyretrieval=true等参数。

MySQL 8.0 连不上,90% 是因为还在用 com.mysql.jdbc.Driver 和 mysql-connector-java-5.x.jar —— 这两个在 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-java</artifactid><version>8.3.0</version></dependency> - 代码和配置中所有
com.mysql.jdbc.Driver替换为com.mysql.cj.jdbc.Driver - Spring Boot 2.1+ 默认带 8.x 驱动,但如果你在
pom.xml里用<exclusions></exclusions>排除了它,又手动引了 5.x,照样报错
连接串缺 serverTimezone 会导致“能连不能查”
只改驱动类名还不够。应用能启动、DataSource 创建成功,但第一次执行 SELECT 就卡住、返回空结果,日志里可能只有模糊的 SQLNonTransientConnectionException —— 这是 MySQL 8.0 驱动默认强制校验服务端时区,而旧连接串没声明。
-
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 vs mysql_native_password
MySQL 8.0 默认认证插件是 caching_sha2_password,旧版 MySql.Data(如 v8.0.12 前)或老 JDBC 驱动不支持,直接报错:Authentication plugin 'caching_sha2_password' cannot be loaded 或 Client does not support authentication protocol requested by server。
- 优先升级驱动到 8.0.28+(JDBC)或最新稳定版(.NET),并启用 SSL(生产环境)
- 临时方案:在 MySQL 命令行执行
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES; - 不推荐长期使用
allowPublicKeyRetrieval=true代替认证插件升级,这是安全妥协
预编译语句缓存行为变化影响 ORM 查询
MySQL 8.0 对预编译语句更敏感。老驱动默认开启 cachePrepStmts=true,但新驱动未显式配置缓存大小时会降级为禁用,导致 MyBatis 等 ORM 的动态 SQL 执行异常或返回空结果。
- 加上这三项可稳住行为:
&cachePrepStmts=true&prepStmtCacheSize=250&prepStmtCacheSqlLimit=2048 - 不加的话,分页查询、
IN列表过长的语句可能被拒绝预编译,回退到普通语句执行,触发权限或语法兼容问题
最容易被忽略的是:错误日志里没报驱动类名问题,不代表驱动就对了;连接成功也不代表能正常执行 SQL —— 时区、字符集、认证插件、预编译缓存,四个点只要漏一个,都可能表现为“静默失败”。











