在mysql 5.6版本中引入引數explicit_defaults_for_timestamp設定,該引數會影響timestamp的預設屬性。
同時在mysql 5.6版本中中,去除一張表只能有乙個timestamp列的限制,允許單錶中使用多個時間戳列。
在mysql 5.6中,當引數explicit_defaults_for_timestamp=off時:
1、timestamp列如果沒有明確指定為nll,則預設為not null
2、timestamp列如果明確指定為null,則會增加預設值null
3、表中第乙個timestamp列,如果沒有宣告為null屬性、default或者 on update,會自動分配 default current_timestamp和on update current_timestamp 屬性。
4、表中第二個timestamp列,如果沒有宣告為null或者default子句,預設自動分配』0000-00-00 00:00:00′。插入行時沒有指明改列的值,該列缺省分配』0000-00-00 00:00:00′,且沒有警告。
如使用下面指令碼建立:create tabletb2004(
idint primary key,
c1timestamp,
c2timestamp,
c3timestamp);
然後showcreate tabletb2004會發現建立指令碼為:create table`tb2004` (
`id`int(11) not null,
`c1`timestamp not null default current_timestamp on update current_timestamp,
`c2`timestamp not null default '0000-00-00 00:00:00',
`c3`timestamp not null default '0000-00-00 00:00:00',primary key(`id`)
) engine=innodb default charset=utf8
在mysql 5.6中,當引數explicit_defaults_for_timestamp=on時:
1、timestamp列如果沒有明確指定為not nll則預設為null
2、表中timestamp列宣告為not null時,則不會為列自動建立預設值,且該列不能顯式插入null值。
3、表中第乙個timestamp列不會自動分配 default current_timestamp和on update current_timestamp 屬性,需要顯式宣告。
4、表中第二各timestamp列與第乙個timestamp列不會存在特殊設定。
如使用下面指令碼建立:create tabletb2004(
idint primary key,
c1timestamp,
c2timestamp,
c3timestamp);
然後showcreate tabletb2004會發現建立指令碼為:create table`tb2004` (
`id`int(11) not null,
`c1`timestamp null default null,
`c2`timestamp null default null,
`c3`timestamp null default null,primary key(`id`)
) engine=innodb default charset=utf8
而如使用下面指令碼建立:create tabletb2005(
idint primary key,
c1timestamp not null,
c2timestamp not null,
c3timestamp not null);
然後showcreate tabletb2005會發現建立指令碼為:create table`tb2005` (
`id`int(11) not null,
`c1`timestamp not null,
`c2`timestamp not null,
`c3`timestamp not null,primary key(`id`)
) engine=innodb default charset=utf8
在mysql5.7.8及之後版本中,引數sql_mode的預設值為:
only_full_group_by
strict_trans_tables
no_zero_in_date
no_zero_date
error_for_division_by_zero
no_auto_create_user
no_engine_substitution
其中no_zero_in_date和no_zero_date會嚴格限制時間欄位和時間戳字段的值:
no_zero_in_date:要求年月日都為0或月日不為0
no_zero_date:要求年月日中任一項不為0
當sql_mode中同時包含no_zero_in_date和no_zero_date時,則不允許向時間欄位和時間戳字段插入任何非法日期的值,即不允許插入'0000-00-00 00:00:00'的值。
總結和建議:
1、為避免受引數explicit_defaults_for_timestamp的影響,在建表時建議寫全timestamp的所有屬性。
2、時間戳字段主要用於記錄行被插入或更新的時間,應避免向時間戳列顯示插入null值或異常時間值。
mysql時間屬性 MySQL 時間戳屬性1
datetime型別和timestamp型別的差別 datetime型別 datetime型別存放資料範圍從1001年到9999年,精度為秒,將時間和日期封裝成格式為yyyymmddhhmmss的整數中,使用8個位元組的儲存空間。datetime型別不存放任何時區相關資訊。datetime型別預設為...
mysql日期時間戳轉換 mysql日期時間戳轉換
1.mysql獲取當前時間戳 mysql select unix timestamp unix timestamp 1525739078 1 row in set mysql select unix timestamp now unix timestamp now 1525739117 1 row ...
mysql怎麼新增時間 MYSQL中新增時間
1.在建立新記錄和修改現有記錄的時候都對這個資料列重新整理 timestamp default current timestamp on update current timestamp 2.在建立新記錄的時候把這個字段設定為當前時間,但以後修改時,不再重新整理它 timestamp default...