这篇文章主要介绍了mysql中datatime与时间戳有什么区别,小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随小编来看看吧!
mysql中有三种日期类型:
日期(年-月-日)
创建表测试(hiredate日期);
datetime(日期时间类型)
创建表测试(hiredate datetime)
时间戳(邮戳类型,保存年——月——日时-分-秒)
创建表测试(hiredate时间戳)
datetime和时间戳的不同点
1,两者的存储方式不一样
对于时间戳,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。而对于datetime,不做任何改变,基本上是原样输入和输出。
2,两者所能存储的时间范围不一样
时间戳所能存储的时间范围为:& # 39;1970-01-01 00:00:01.000000& # 39;到“2038-01-19 03:14:07.999999& # 39;。
datetime所能存储的时间范围为:& # 39;1000-01-01 00:00:00.000000& # 39;到“9999-12-31 23:59:59.999999& # 39;。
总结:时间戳和DATETIME除了存储范围和存储方式不一样,没有太大区别。当然,对于跨时区的业务,时间戳更为合适。
3,自动初始化和更新
自动初始化指的是如果对该字段(譬如上例中的hiredate字段)没有显性赋值,则自动设置为当前系统时间。
自动更新指的是如果修改了其它字段,则该字段的值将自动更新为当前系统时间。
它与“explicit_defaults_for_timestamp”参数有关。
默认情况下,该参数的值为从
mysql>, show variables like & # 39; % explicit_defaults_for_timestamp % & # 39;; + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | |,Variable_name Value | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | |,explicit_defaults_for_timestamp OFF | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + row set 拷贝(0.00,sec)
总结:时间戳有自动初始化和更新,当你更新某条记录的时候,该列值会自动更新,这是和datatime最大的区别。
<强>补充:DATETIME与时间戳的一些区别与问题强>
今天遇到一个问题,明明数据有更新,update_time字段却还停留在创建数据的时候。
按常理来说这个字段应该是自动更新的才对。
查了一下表结构,
“update_time”, datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
发现update_time字段的类型是DATETIME
<强>由此牵扯出两个问题,(1)时间戳与DATETIME的区别;(2)CURRENT_TIMESTAMP为什么能用于DATETIME类型强>
时间戳与DATETIME的区别
<>强)强> DATETIME的默认值为零,时间戳的字段默认不为空(非空),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且更新语句中没有指定该列的更新值,则默认更新为当前时间。
这个区别就解释了为什么平时我们都不用可以管这个字段就能自动更新了,因为多数时候用的是时间戳,而此处用的是DATETIME,不会有自动更新当前时间的机制,所以需要在上层手动更新该字段
<强> b) 强> DATETIME使用8字节的存储空间,时间戳的存储空间为4字节。因此,时间戳比DATETIME的空间利用率更高。
这个区别解释了为啥时间戳类型用的多
<强> c) 强>两者的存储方式不一样,对于时间戳,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。而对于DATETIME,不做任何改变,基本上是原样输入和输出。
<强> d) 强>两者所能存储的时间范围不一样
时间戳所能存储的时间范围为:& # 39;1970-01-01 00:00:01.000000& # 39;到的2038-01-19 03:14:07.999999& # 39;;
datetime所能存储的时间范围为:& # 39;1000-01-01 00:00:00.000000& # 39;到“9999-12-31 23:59:59.999999& # 39;。
<强> CURRENT_TIMESTAMP为什么能用于datetime类型强>
在mysql 5.6之前的版本,CURRENT_TIMESTAMP只能用于时间戳类型,
5.6版本之后,CURRENT_TIMESTAMP也能用于datetime类型了
选择版本()查了一下数据库发现确实版本是5.6.29