Spring Boot+MySQL存储早于1970-01-02的OffsetDateTime报错求助
问题原因及解决方案:存储早于1970-01-02的日期失败
核心原因
MySQL的TIMESTAMP类型存在时间范围限制,它的有效存储范围是1970-01-01 00:00:01 UTC到2038-01-19 03:14:07 UTC。当你尝试存储的时间转换为UTC后超出这个范围时,就会触发Data truncation错误。
具体分析
你的MySQL实例以--default-time-zone=+00:00(UTC时区)启动,而你要存储的是**Asia/Kuala_Lumpur时区(+07:30)**的1970-01-01T00:00+07:30:
- 该时间转换为UTC时区的计算结果为:
1970-01-01 00:00:00减去7小时30分,得到1969-12-31 16:30:00 UTC。 - 这个时间早于
TIMESTAMP的最小有效值1970-01-01 00:00:01 UTC,因此MySQL拒绝存储,抛出数据截断错误。
而测试成功的1970-01-02T00:00+07:30转换为UTC后是1970-01-01 16:30:00 UTC,该时间在TIMESTAMP的有效范围内,所以可以正常存储。
解决方案
方案1:修改数据库字段类型为DATETIME
DATETIME类型的时间范围远大于TIMESTAMP(覆盖1000-01-01 00:00:00到9999-12-31 23:59:59),且它存储的是字面时间,不受时区转换的范围限制。执行以下SQL修改表结构:
ALTER TABLE students MODIFY COLUMN birth_date DATETIME NULL DEFAULT NULL;
方案2:限制存储的时间范围(若必须使用TIMESTAMP)
如果坚持使用TIMESTAMP,则需要确保待存储的时间转换为UTC后不早于1970-01-01 00:00:01 UTC。对应Asia/Kuala_Lumpur时区的本地时间最小值为1970-01-01 07:30:01 +07:30,早于该时间的记录无法存入TIMESTAMP字段。
内容的提问来源于stack exchange,提问作者user3357926
相关产品推荐
相关产品推荐

