MySQL中的时间问题,还需要进一步研究

使用Java开发MySQL数据库应用时,日期和时间类型经常使用date和datetime,最近从PHP的应用中导出一份数据库脚本发现其中的日期时间使用的是int类型,当用Java语言访问此类时间时不能正确转换成java.util.Date。使用Date类型保存数据到MySQL数据库中时出现了这样的错误:
Data truncation: Out of range value for column 'publishTime',这表明数据库中的int数据长度不足,不能保存Java日期类型。查询了一些网上资料发现了如下介绍:

MySQL通常存储时间用datetime类型,现在很多系统也用int存储时间,它们有什么区别?使用int这样对于日期计算时比较好。

int
(1)4个字节存储,INT的长度是4个字节,存储空间上比datatime少,int索引存储空间也相对较小,排序和查询效率相对较高一点点
(2)可读性极差,无法直观的看到数据,可能让你很恼火

TIMESTAMP
(1)4个字节储存
(2)值以UTC格式保存
(3)时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区。
(4)TIMESTAMP值不能早于1970或晚于2037

datetime
(1)8个字节储存
(2)与时区无关
(3)以'YYYY-MM-DD HH:MM:SS'格式检索和显示DATETIME值。支持的范围为'1000-01-01 00:00:00'到'9999-12-31 23:59:59'

在知道了上述内容之后如何解决Java日期类型与MySQL数据库中日期的转换,主要采取的方式有两种:

一是Java语言中使用java.util.Date类型,数据库中的日期类型使用datetime,这样两者都可以正常转换

二是数据库中日期还是使用数值型,方便比较和计算,但查看不方便,但是int的类型是4个字节,而Java中的Date保存到数据库是8个字节,还是存在数据长度不足的问题,于是考虑将int类型改为bigint类型,这样Java中的日期就可以保存到数据中了

补充说明:在Java中直接使用Date创建的属性保存到数据库bigint类型的字段中依然存在Data truncation问题,因此使用日期Date类型的变量需要将Date转换为long类型,或者在获取当前日期时使用System.currentTimeMillis(),这样在保存到数据库中时就不出现Data truncation问题了

posted @ 2021-12-26 14:33  培轩  阅读(146)  评论(0)    收藏  举报