目录

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的。

MySQL :: MySQL 8.0 Reference Manual :: 11.2.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME

有时我们并不想要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,保证时间的存取一致。