mysql与mssql中datetime类型字段问题_TIMESTAMP类型字段在SQL Server和MySQL中的含义和使用...

公众号上转的满天飞的一篇文章,mysql优化相关的,无意中瞄到一句“尽量使用timestamp而非datetime”,之前对timestamp也不太熟悉,很少使用,于是查了一下两者的区别。

其实,不管在sql server中还是mysql中,“尽量使用timestamp而非datetime”都是有问题的。

e9d0dfccf34449455bd34b6f8b61c6de.png

在sql server中的timestamp

sql server中,timestamp是rowversion的同义词,或者说是别名,timestamp或者rowversion是什么鬼?

msdn上的解释是:数据库中公开的、自动生成的唯一二进制数字的数据类型。。

两个定语:唯一的,二进制的,说白了就是数据库级别唯一性的一个二进制数据类型

sql server中timestamp/rowversion的表现:

1,不可显式插入(或者是更新)。

2,对(包含了)rowversion的表更新非rowversion字段更新的时候,rowversion会自动更新。

3,rowversion在数据库级别具有全局性、递增性、不可回滚性等。

不可显式往timestamp类型字段插入值,只能以default或者默认值的方式插入

72322587b20cee2b567977e89cf4c0a4.png

只能以默认值或者默认生成的方式插入数据

c2aac5fd06e43cbb210d8770d526e136.png

对(包含了)rowversion的表中的数据行更新的时候,rowversion会自动更新。

0f44bc0adc86f3f3ba8b419b42798adf.png

全局性,这里暂不表述全局性的一些细节问题。

30393733789a42bb295948e67096cdbb.png

rowversion的作用:

标记数据行的更改,也就是说,一个表包含了rowversion的字段的时候,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则不会发生这种情况。

举个简单的例子。

如下,与sqlserver中完全不一致,mysql中timestamp 字段是一个日期字段,允许显式插入值。

同一个字段值,没有发生更改的情况下,也就是同一个值,当修改系统的时区之后,显示出来的结果是不一样的。

这一点正如上面说的:mysql将timestamp类型的值转换为utc时间存储,当然检索的时候以当前时区的时间返回。

9dbcf816d034bd3d3406a1ebf37b765c.png

656f3bc78cee68109a71b103565982aa.png

貌似转来转去的有点蛋疼,这个特性有什么用处?

这一点对于某些夸时区的应用显示十分有效,最最简单的就是outlook上的收发邮件的时间显示,

比如夸时区的两个人发邮件,发邮件的时间是一个确定的时间,对于a来说,显示自己的时区时间,对于b来说,也是显示为自己时区的时间。

这一点就有点类似于timestamp,存储为标准时间,根据系统转换为具体的时区时间。

以上,不管在sql server中还是mysql中,datetime和timestamp的作用以及特性都是不同的,sql server中尤甚,mysql也有各自的特性。

选取某种字段类型,是根据需要来的,而不是说可以尽量用那个,尽量不用那个。

数据库中很多东西都是根据具体情况来的,网上总结的很多优化的条条框框,怎么说呢,还是不说了!

参考:

关于两者的区别,笔者一开始也不完全清楚,我也是各种搜索之后简单总结了一下,无意冒犯原作者。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值