mysql的时间戳类型timestamp、datetime和int

mysql的时间戳有很多写法与用法,此处做一下简单的对比分析。

date的格式是YYYY-MM-DD,取值范围为'1000-01-01' 至 '9999-12-31',占用3个字节。datetime的格式为YYYY-MM-DD HH:MM:SS,其取值范围为'1000-01-01 00:00:00' 至 '9999-12-31 23:59:59',占用8个字节。

timestamp范围为'1970-01-01 00:00:01'  至 '2038-01-19 03:14:07',占用4个字节。

datetime和timestamp还可以存储毫秒部分,比如存储6位长的毫秒时,类型就为:datetime(6)或者timestamp(6),此时占用的字节也更多。

字符串转时间戳的时候,分隔符是很宽泛的,所以'10:45:15' 会按 '0000-00-00' 格式进行转换,而不会按所想的转成时间,又由于45是一个不合法的月份,导致报错。

在严格模式下(strict mode)下,'2004-04-31'会因为日子不存在而出错,但是在查询时可以使用create_time < '2016-04-31' and create_time > '2016-04-00'。

timestamp不接受年月日为0的不合法值,但是'0000-00-00 00:00:00'作为空值是合法的。

datetime和timestamp都可以使用CURRENT_TIMESTAMP来设置默认值,但因为主从同步,一些配置不合理会导致问题,不建议使用。

直接使用int(10)来存储时间秒数也是一种选择,而且在查询时(比如查一周内的数据:create_time > unix_timestamp() - 24*3600*7)反而更容易书写,否则得写成:create_time > now() - interval 1 week; 当然查询出来的时间不会那么直观。

综上:从存储空间,查询便捷性,数据直观来看,还是timestamp(0)更为推荐。

发表于 2017年02月17日 17:03   评论:0   阅读:2389  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo