前言:
了不起:学弟,我看你最近在学习MySQL啊?学的怎么样啊,要不要我考考你啊?
学弟:哈哈,是啊,最近学的不错,感觉自己很强。
了不起翻了个白眼:我问你,MySQL里面的字段类型datetime和timestamp有什么区别?
学弟:嗯。。。我就知道这两个都是时间,具体怎么样我还真的不知道。。了不起:让你再嘚瑟!我给你讲讲吧!
正文:
首先,我跟你说一个我以前遇到的一个生产问题。
项目背景:会员系统,出了个大会员活动,这个活动就是惊喜价XXX元买终身10年大会员。每个用户都有一个字段是会员到期日。这个字段用的就是timestamp。
问题就来了,假设现在2018年,有的人买了20年的会员,问题就出现了。数据库报错,用户的会员截止日还是第一个10年会员的截止日期。
业务框框找上门来,我们也是迅速看生产日志去查找问题。一看到报错我们也就明白是啥问题了。相信看到这里,学习过这两个参数的同学就能明白,原因就出在timestamp的时间是有范围的。
- 时间范围不同,通过我讲的这个生产问题,我们第一个得出的结论就是时间范围不同。timestamp的范围是有限制的,而datetime的时间是没有限制的。
timestamp的范围是从1970-01-01 到2038-01-19,这也就是为什么上面的生产问题会报错的原因。2018年,买了20年的会员就到了2038年,只要过了1-19号,那么用timestamp就会出现错误。
2.timestamp和datetime占用大小不一样。
在v5.6.4之前的版本。datetime占8个字节,timestamp占4个字节。
在这个版本之后datetime和timestamp占用的字节数都有一定程度的减少,并且根据是否有秒的小数的情况,相对应生成浮动大小。
3.timestamp会根据时区的情况进行时间转换,假设当前存储的时区和检索的时区有差异,那么timestamp会根据检索的时区进行转换。
而datetime就不会,datetime是属于你给他什么他就拿到什么,没有timestamp得这个功能。
4.二者存储null时有不同的效果,如果你的时间是datetime那么datetime就会把null存入进去,如果你用的是timestamp,那么timestamp会根据现有的时间帮你插入。
对于二者的区别就介绍的差不多了,在我们开发的实际情况中,要根据实际的业务情况去选择时使用timestamp还是datetime,如果没有什么特殊的需求,那就用timedate即可
建议使用timestamp的情况
1.当我们存储时间范围是比较小的时候。
2.当时间精度要求比较高的时候,timestamp可以达到的精度是纳秒级别。
3.需要使用默认值为当前时间的。
建议使用datetime 的情况
1.存储时间范围较大的时间。
2.需要存储时间与时区无关的情况。
结尾:
学到这里大家也应该明白了,这个生产问题的前后的原因,也明白了mysql中timestamp和datetime的区别啦。