参考:
警告!别再使用TIMESTAMP作为日期字段-51CTO.COM
MySQL :: MySQL 8.0 Reference Manual

基本区别

  1. 范围区别
  • The DATE type is used for values with a date part but no time part. MySQL retrieves and displays DATE values in '_`YYYY-MM-DD`_' format. The supported range is '1000-01-01' to '9999-12-31'.
  • The DATETIME type is used for values that contain both date and time parts. MySQL retrieves and displays DATETIME values in '_`YYYY-MM-DD hh:mm:ss`_' format. The supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'.
  • The TIMESTAMP data type is used for values that contain both date and time parts. TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.
  1. DateTime && Timestamp支持6位毫秒显示:datetime(6) // timestamp(6)
  • the range for DATETIME values is '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'
  • range for TIMESTAMP values is '1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999'.
  1. TimeStamp带有时区,DateTime没有
  2. TimeStamp带有毫秒时,类型 TIMESTAMP 占用 7 个字节,而 DATETIME 无论是否存储毫秒信息,都占用 8 个字节。
  3. 毫秒支持:从 MySQL 5.6 版本开始DateTime(N) && Timestamp(N)均支持最大6位毫秒

mysql默认时间为,当前时区转化为UTC时间进行存储,因此当时间不对时候应检查自己的Mysql时区设置,未设置Mysql时区,默认使用系统时区!
MySQL :: MySQL 8.0 Reference Manual :: 5.1.15 MySQL Server Time Zone Support 时区设置

设置时间自动更新

详细文档:MySQL :: MySQL 8.0 参考手册 :: 11.2.5 时间戳和日期时间的自动初始化和更新

插入设置,更新更新:其中小数部分必须设置一致
正确:

CREATE TABLE t1 ( 
ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)
);

错误:

CREATE TABLE t1 (
ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(3)
);

建议:

  • TimeStamp性能不如 DATETIME:DATETIME 不存在时区转化问题。
  • 性能抖动:海量并发时,存在性能抖动问题。

日期字段推荐使用 DATETIME,没有时区转化。即便使用 TIMESTAMP,也需要在数据库中显式地配置时区,而不是用系统时区

  • DATETIME 占用 8 个字节,TIMESTAMP 占用 4 个字节,DATETIME(6) 依然占用 8 个字节,TIMESTAMP(6) 占用 7 个字节;
  • TIMESTAMP 日期存储的上限为 2038-01-19 03:14:07,业务用 TIMESTAMP 存在风险;
  • 使用 TIMESTAMP 必须显式地设置时区,不要使用默认系统时区,否则存在性能问题,推荐在配置文件中设置参数 time_zone = ‘+08:00’;
  • 推荐日期类型使用 DATETIME,而不是 TIMESTAMP 和 INT 类型
  • 表结构设计时,每个核心业务表,推荐设计一个 last_modify_date 的字段,用以记录每条记录的最后修改时间。