mysql timestamp类型使用问题


CREATE TABLE `hy_goods_config` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '类型 0-goods 1-sku',
  `obj_code` varchar(64) NOT NULL DEFAULT '0' COMMENT '对象code',
  `sub_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '配置类型0-城市',
  `content` json NOT NULL COMMENT '配置内容',
  `is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记0-未删除  1-已删除',
  `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  `start_time` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '开始时间',
  `end_time` timestamp NOT NULL DEFAULT '1972-01-01 00:00:00' COMMENT '结束时间',
  PRIMARY KEY (`id`),
  KEY `idx_obj_id` (`obj_code`)
) ENGINE=InnoDB AUTO_INCREMENT=874 DEFAULT CHARSET=utf8mb4 COMMENT='商品配置'

执行语句

INSERT INTO hy_goods_config (TYPE, obj_code, sub_type, content, start_time, end_time) values(1, '11111', 2, '[]', NULL, NULL)

问题

start_time和end_time均为当前时间

原因

MySQL 的 explicit_defaults_for_timestamp 系统变量控制了 TIMESTAMP 类型的行为。如果这个变量设置为 OFF(这是 MySQL 5.6 及之前版本的默认行为),那么 TIMESTAMP 列如果没有显式地指定值,会自动使用当前时间作为默认值,即使你已经指定了不同的默认值。

可通过SHOW VARIABLES LIKE 'explicit_defaults_for_timestamp'的方式查看对应的配置

另外需要注意的是timestamp类型支持的最小时间为1970-01-01 00:00:01