时间显示偏差是因 JDBC 驱动未正确解析时区,需在 DBeaver 连接中显式设置 serverTimezone=Asia/Shanghai(URL 参数)或 serverTimeZone=Asia/Shanghai(驱动属性),并测试连接、刷新元数据。

时间显示快或慢几个小时,基本就是 serverTimezone 没设对,不是服务器时区错了,是 DBeaver 连接时没告诉 JDBC 驱动该用哪个时区解析 datetime。
为什么 datetime 字段时间不对
MySQL 存储 DATETIME 类型本身不带时区,但 JDBC 驱动在把字节流转成 Java LocalDateTime 或 Timestamp 时,会按客户端指定的时区做偏移换算。DBeaver 默认可能用系统默认时区(比如 UTC),而你数据库里存的是东八区时间,结果就多出 8 小时。
- 现象:查出来的
2024-05-20 14:30:00在 DBeaver 里显示成2024-05-20 06:30:00 - 不是 MySQL 服务端时间错,
SELECT NOW()返回的永远是你期望的本地时间 - 也不是 DBeaver 界面语言或系统时区设置的问题,它只影响 UI 文字,不影响 JDBC 数据解析
必须在连接 URL 或驱动属性里显式设 serverTimezone=Asia/Shanghai
这个参数告诉 JDBC 驱动:“MySQL 服务器的时间是按 Asia/Shanghai 存的,请别按 UTC 解析”。不能写 GMT+8 或 etc/GMT-8 —— 后者是 POSIX 格式,JDBC 不认;前者不精确(夏令时等)。
- 推荐方式:在连接配置的【驱动属性】页添加键值对:
serverTimeZone=Asia/Shanghai - 备选方式:在 JDBC URL 末尾加参数,例如:
jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai - 注意拼写:
serverTimeZone(带大写 T 和 Z)是 DBeaver 驱动属性名;serverTimezone(全小写)是 JDBC URL 参数名,大小写敏感
常见连带错误:连得上但时间仍错,或报 Unknown system variable 'time_zone'
这说明参数传过去了,但 MySQL 服务端压根不支持该变量(常见于极老版本如 5.5 或某些 MariaDB 分支),或者驱动类名和参数不匹配。
- 确认驱动类是
com.mysql.cj.jdbc.Driver(MySQL 8.x 必须用 cj 驱动,com.mysql.jdbc.Driver已废弃) - 如果用的是 MySQL 5.7 及更早,且无法升级,可尝试
useTimezone=true&serverTimezone=Asia/Shanghai组合参数 - 避免同时设
useSSL=false和allowPublicKeyRetrieval=true却漏掉serverTimezone,四个参数缺一不可时容易只修一半
真正容易被忽略的是:改完驱动属性后必须点【测试连接】再【完成】,而不是只点【确定】——后者不会触发元数据重载,旧缓存里的时间格式还会沿用。如果表已打开,右键连接选【Refresh Metadata】才能让新时区立即生效。











