# 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 及之后版本,可以将 timestamp 和 datetime 数据最高精确微秒
# 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 同时适用于 timestamp 和 datetime,且不限制数量。