TIMESTAMP类型字段在SQL Server和MySQL中的含义和使用
公众号上转的满天飞的一篇文章,mysql优化相关的,无意中瞄到一句“尽量使用timestamp而非datetime”,之前对timestamp也不太熟悉,很少使用,于是查了一下两者的区别。
其实,不管在sql server中还是mysql中,“尽量使用timestamp而非datetime”都是有问题的。
在sql server中的timestamp
只能以默认值或者默认生成的方式插入数据
对(包含了)rowversion的表中的数据行更新的时候,rowversion会自动更新。
全局性,这里暂不表述全局性的一些细节问题。
mysql中的timestamp
在mysql中:
datetime :长度8字节,用来标识包含日期和时间部分的值,mysql以‘yyyy-mm-dd hh:mm:ss’格式检索并显示datetime类型字段。
支持的范围是‘1000-01-01 00:00:00’ to ‘9999-12-31 23:59:59’.
timestamp :长度4字节,用来标识包含日期和时间部分的值,
支持的范围是 ‘1970-01-01 00:00:01’ (标准时间) to ‘2038-01-19 03:14:07’ (标准时间)。
datetime 与timestamp 的不同:
mysql将timestamp类型的值转换为utc时间存储,当然检索的时候以当前时区的时间返回,下面具体举例,而datetime则不会发生这种情况。
同一个字段值,没有发生更改的情况下,也就是同一个值,当修改系统的时区之后,显示出来的结果是不一样的。
这一点正如上面说的:mysql将timestamp类型的值转换为utc时间存储,当然检索的时候以当前时区的时间返回。
貌似转来转去的有点蛋疼,这个特性有什么用处?
这一点对于某些夸时区的应用显示十分有效,最最简单的就是outlook上的收发邮件的时间显示,
比如夸时区的两个人发邮件,发邮件的时间是一个确定的时间,对于a来说,显示自己的时区时间,对于b来说,也是显示为自己时区的时间。
这一点就有点类似于timestamp,存储为标准时间,根据系统转换为具体的时区时间。
以上,不管在sql server中还是mysql中,datetime和timestamp的作用以及特性都是不同的,sql server中尤甚,mysql也有各自的特性。
选取某种字段类型,是根据需要来的,而不是说可以尽量用那个,尽量不用那个。
数据库中很多东西都是根据具体情况来的,网上总结的很多优化的条条框框,怎么说呢,还是不说了!
参考:
关于两者的区别,笔者一开始也不完全清楚,我也是各种搜索之后简单总结了一下,无意冒犯原作者。