本文已收录在Github关注我,紧跟本系列专栏文章,咱们下篇再续!

  • 🚀 魔都架构师 | 全网30W技术追随者
  • 🔧 大厂分布式系统/数据中台实战专家
  • 🏆 主导交易系统百万级流量调优 & 车联网平台架构
  • 🧠 AIGC应用开发先行者 | 区块链落地实践者
  • 🌍 以技术驱动创新,我们的征途是改变世界!
  • 👉 实战干货:编程严选网

1 显示

TIMESTAMP列显示格式与DATETIME列相同。显示宽度都固定在19字符,格式:

YYYY-MM-DD HH:MM:SS

2 范围

  • datetime 以YYYY-MM-DD HH:MM:SS格式检索和显示DATETIME值。支持的范围为1000-01-01 00:00:009999-12-31 23:59:59
  • TIMESTAMP值不能早于1970或晚于2037

3 储存

TIMESTAMP

  • 4字节储存
  • 值以UTC格式保存
  • 时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区

datetime

  • 8字节储存
  • 实际格式储存
  • 与时区无关

4 时区影响

  1. 先插入一个数据insert into t8 values(now(), now());
  2. 改变客户端时区(东9区,日本时区)
  3. 再次显示插入的数据,变化了,timestamp类型的数据增加了 1个小时

timestamp

timestamp默认允许“非空”(not null by default), 如在定义“ts TIMESTAMP DEFAULT NULL” 是非法的。可指定为空 null ,“ts TIMESTAMP NULL" ,这时可以在添加语句改变默认值。

ts2 TIMESTAMP NULL DEFAULT 0,
ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP

default,一个表中只能有一个列选择下面的其中一种:

# 语义:当插入(INSERT)一条新记录时,如该字段未被显式赋值,DB会自动将当前时间戳作为该字段默认值
# 用途:常用于记录数据的创建时间,create_time:只在插入时自动设置,之后更新记录时它不会改变
default CURRENT_TIMESTAMP

# 语义:当这条记录被更新(UPDATE)时(无论你更新的啥字段),DB会自动将该字段值更新为当前时间戳
# 用途:常用于记录数据的最后修改时间,如 update_time 字段
ON UPDATE CURRENT_TIMESTAMP

ON UPDATE 见上2

# 最强大、最常用组合
# 语义:1.当插入(INSERT)新记录时,该字段会自动设置为当前的创建时间
# 2.当更新(UPDATE)这条记录时,该字段会自动更新为当前的修改时间
# 该字段完美实现“创建时自动记录创建时间,更新时自动变为修改时间”,而无需应用层代码干预
default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP