mysql中timestamp与datetime的区别
目录
timestamp
使用YYYY-MM-DD HH:MM:SS[.fraction]类型的日期,支持6位小数秒。
支持范围从'1970-01-01 00:00:01’UTC 到'2038-01-19 03:14:07’UTC。
对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。
datetime
使用YYYY-MM-DD HH:MM:SS[.fraction]类型的日期,支持6位小数秒。
支持范围是从'1000-01-01 00:00:00’到'9999-12-31 23:59:59’。
DATETIME,存储与查询时不做任何改变,原样输入和输出。
关于自动更新
TIMESTAMP和 DATETIME列可以自动初始化并更新为当前日期和时间(即当前时间戳)。
自动更新指的是如果修改了其它字段,则该字段的值将自动更新为当前系统时间。
这个自动更新与explicit_defaults_for_timestamp参数设置有关:
mysql> show variables like '%explicit_defaults_for_timestamp%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | OFF |
+---------------------------------+-------+
1 row in set (0.00 sec)
我们看到默认情况这个参数是OFF的。
有时我们并不想要timestamp或datetime列自动更新时,如何解决:
- 1、将explicit_defaults_for_timestamp的值设置为ON。
- 2、explicit_defaults_for_timestamp的值依旧是OFF,可以采用以下两种方式:
- 指定一个默认值,比如default xxx
- 允许该列NULL值,指定NULL属性
注意
在MySQL 5.6.5版本之前,Automatic Initialization and Updating只适用于TIMESTAMP,而且一张表中,最多允许一个TIMESTAMP字段采用该特性。
从MySQL 5.6.5开始,Automatic Initialization and Updating同时适用于TIMESTAMP和DATETIME,且不限制数量。
对于国际化的项目,我们就需要时间的时区问题,除了php环境的时区设置外,还要注意mysql的连接时的时区设置,比如系统、php环境、mysql连接都统一使用UTC,保证时间的存取一致。