mysql中的timestamp类型遇到的问题 timestamp 类型1.背景 有一个表需要有【服务开始时间、服务结束时间、技术对接时间、技术完成时间等一系列关于时间类型】,当时全部使用的是 timesta
有一个表需要有【服务开始时间、服务结束时间、技术对接时间、技术完成时间等一系列关于时间类型】,当时全部使用的是 timestamp 类型。
示例:
create table if not exists t_regional_dispatch_service(
id int(11) auto_increment primary key,
....
service_time timestamp comment '服务时间',
service_end_time timestamp comment '服务结束时间',
practical_service_time timestamp comment '实际开始时间',
practical_service_end_time timestamp comment '实际结束时间',
first_time_clock timestamp comment '首次打卡',
last_time_clock timestamp comment '最后一次打卡',
create_time timestamp default CURRENT_TIMESTAMP comment '创建时间',
update_time timestamp default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
)engine=InnoDB default charset=utf8mb4 comment '服务单';
当程序中进行数据保存的时候,没有填值的时间类型,也出现了保存数据时的时间。
2.解决- 产生原因:
在上面的SQL中 timestamp 类型的数据都只是声明了 timestamp 类型,缺少原始建表中的 NULL 和 DEFAULT 属性。 - 问题所在:
Mysql中有一个 explicit_defaults_for_timestamp 变量,这个变量决定了Mysql是否为 timestamp 列的 DEFAULT 和 NULL 属性的处理启用某些非标准的行为。
可以前往Mysql的官方文档进行详细查看 https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
explicit_defaults_for_timestamp=OFF时,服务器会启动非标准行为,按照以下规则处理 timestamp 类型列:
(1)没有明确使用 NULL 属性声明的 timestamp 列会自动使用 NOT NULL 属性声明。将该列设置为 current timestamp
(2)表中的第一个 timestamp 属性列,如果没有明确的使用 NULL 属性,DEFAULT 或 ON UPDATE 属性声明,将自动用 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 属性来声明
(3)在第一个 timestamp 属性列,如果没有明确的使用 NULL 属性或明确的 DEFAULT 属性来声明,就会自动声明为 DEFAULT '0000-00-00 00:00:00'。对于插入的行,如果没有为该列指定明确的值,该列将会被分配为 '0000-00-00 00:00:00',并且不会发生警告。根据是否启用了严格的 SQL mode 或包含 NO_ZERO_DATE 的 SQL mode,默认值 '0000-00-00 00:00:00' 可能不被允许。
参考资料:https://blog.csdn.net/bisal/article/details/121173175