# 1

timestamp 与时区有关,时区变化,select 出来的时间也会又变化

datetime 不会,存入什么时间就是什么时间

当 MySQL 参数 time_zone=system 时,查询 timestamp 字段会调用系统时区做时区转换,而由于系统时区存在全局锁问题,在多并发大数据量访问时会导致线程上下文频繁切换,CPU 使用率暴涨,系统响应变慢设置假死

# 2

Mysql5.6.6 版本里面增加了一个参数 explicit_defaults_for_timestamp,其默认值为 false,它会让表定义非所见即所得,即 on update current_timestamp,没有显性赋值,则自动设置为当前系统时间

# 3

存储需要大小不同,timestamp 需要 4 个字节存储

  • datetime MySQL 5.6.4 之前,DATETIME 值需要 8 字节存储,之后版本默认是 5 个字节存储
  • datetime 最大支 datetime (6),(timestamp 同样),小数位秒精度当有 1-2 位时,总共需要 5+1 个字节,3-4 需要 5+2 个字节,5-6,需要 5+3 个字节
    例 2019-07-13 22:00:00 需要 5 个字节,2019-07-13 22:00:00.999 需要 7 个字节,2019-07-13 22:00:00.999999 需要 8 个字节
  • datetime datetime (3) 设置默认值或 on update 时,需要注意 current_timestamp(3),而不是 current_timestamp()

# 4

在 MySQL 5.6.4 及之后版本,可以将 timestampdatetime 数据最高精确微秒

# 5

取值范围不同,timestamp 所能存储的时间范围为:'1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999'

datetime 所能存储的时间范围为:'1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'

# 6

在 MySQL 5.6.5 版本之前, default current_timestamp on update current_timestamp 只适用于 timestamp,而且一张表中,最多允许一个 timestamp 字段采用该特性。 从 MySQL 5.6.5 开始, default current_timestamp on update current_timestamp 同时适用于 timestampdatetime,且不限制数量。