mysql记录时间选择哪种字段合适?

分享于:2019-10-31 19:52:27

TIMESTAMP


4个字节储存;值以UTC格式保存;.时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区。


DATETIME


8个字节储存;实际格式储存;与时区无关;datetime 以'YYYY- MM-DD HH:MM:SS'格式检索和显示DATETIME值。支持的范围为'1000-01-01 00:00:00'到'9999-12-31 23:59:59'TIMESTAMP值不能早于1970或晚于2037


INT


存时间戳。占用资源少,查询速度快。条件范围搜索使用between没什么问题。查询条件自由拼接。


datetime和timestamp相对于int来说也有一个小小的好处,就是对于时间类型来说,可以有一系列的时间函数可以用。


timestamp和datetime最大的区别是:


datetime在存储日期数据时,按实际输入的格式存储,即输入什么就存储什么,与时区无关;而timestamp值的存储是以UTC(世界标准时间)格式保存的,存储时对当前时区进行转换,检索时再转换回当前时区,即查询时,根据当前时区的不同,显示的时间值是不同的。


三种时间类型比较:


插入效率:datetime > timestamp > int

读取效率:int > timestamp > datetime

储存空间:datetime > timestamp = int


分别使用datetime、timestamp、int字段类型来看下:


使用datetime直接显示时间,这是个不错的选择,但是如果考虑到时区,很明显计算上的麻烦。


使用timestamp可以根据系统的时区来自动输出时间,但是单个用户要定制自己的时区呢?再者你不怕麻烦,在程序里面实现了这个计算,服务器若是换个地方,改了下时区,你程序里面计算单个用户当地时间的代码怎么办(timestamp出来的时间会根据时区的变化而变化,在某些情况下是不错的选择,但在某些情况下,真的很鸡肋)。


使用int从上面两个类型的缺点看来,貌似这个类型可以解决以上的问题,其实我们只要存格林时间的unix timestamp就好了,时区时间的计算上也很方便,读取的效率也不错。我觉得用这个储存的缺点呢,就是直接select的时候时间不能直观的显示出来。看看其他开源程序是怎么做的discuz, typecho, emlog等等等等,他们都选用int了,这一定有他们的道理。