You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data JPA插入/更新MySQL时丢失毫秒值问题求助

解决EntityManager操作时MySQL日期毫秒值丢失的问题

1. 修正JDBC连接URL的时间参数配置

mysql-connector-j 8.0.x 默认不会自动保留毫秒精度,必须在连接URL中指定关键参数来启用标准日期处理逻辑:
在application.properties中配置:

spring.datasource.url=jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useLegacyDatetimeCode=false&zeroDateTimeBehavior=convertToNull

核心是useLegacyDatetimeCode=false,它会让驱动放弃旧的日期解析逻辑,采用JDBC 4.2标准传递带毫秒的时间,配合正确的serverTimezone设置,避免时区转换时丢失精度。

2. 实体类字段映射匹配数据库精度

你的表字段为DATETIME(3)或DATETIME(6),实体类中需明确指定字段的数据库定义,避免Hibernate自动推断导致精度丢失:
优先使用Java 8的LocalDateTime类型(对毫秒支持更完善),示例:

@Column(name = "update_time", columnDefinition = "DATETIME(6)")
private LocalDateTime updateTime;

如果使用@CreationTimestamp注解,同样需要搭配columnDefinition:

@CreationTimestamp
@Column(name = "create_time", columnDefinition = "DATETIME(3)")
private LocalDateTime createTime;

3. 规范EntityManager的参数绑定方式

手动执行原生SQL或JPQL时,禁止用字符串拼接日期,必须使用setParameter方法绑定参数:

// 原生SQL参数绑定示例
entityManager.createNativeQuery("INSERT INTO user(create_time) VALUES(?)")
    .setParameter(1, LocalDateTime.now())
    .executeUpdate();

字符串拼接会导致驱动自动截断毫秒值,即使日志显示参数带毫秒,实际传入数据库的仍是截断后的数据。

4. 验证数据库本身的精度支持

先在MySQL客户端手动插入带毫秒的记录,确认数据库层面能正常保留精度:

INSERT INTO user(create_time) VALUES('2024-05-20 16:45:30.789');

查询结果若能显示毫秒,说明数据库配置无问题,问题集中在应用端的配置或代码逻辑。

5. 尝试升级MySQL驱动版本

你当前使用的mysql-connector-j 8.0.33存在部分日期精度相关的已知bug,可升级至最新稳定版(如8.0.36),修复驱动层面的精度丢失问题后再测试。


内容的提问来源于stack exchange,提问作者Chris Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:57:16