1. 程式人生 > 其它 >mysql-timestamp資料型別

mysql-timestamp資料型別

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' 可能不被允許。

參考

參考資料:https://blog.csdn.net/bisal/article/details/121173175