mysql-timestamp資料型別
阿新 • • 發佈:2022-03-15
timestamp 型別
1.背景
有一個表需要有【服務開始時間、服務結束時間、技術對接時間、技術完成時間等一系列關於時間型別】,當時全部使用的是 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' 可能不被允許。