我在MySQL时间戳列中插入/更新NULL时会发现意外行为。
请考虑以下陈述。
create table temp(id int, hireDate timestamp default 0);
insert into temp (id) values(1);
insert into temp (id, hireDate) values(2, null);
select * from temp;
id hireDate
-----------------------------
1
2 2012-09-19 10:54:10.0
第一个插入(在SQL中未指定hiredate
时,hireDate为null(0)
,这是预期的。
但是,当在SQL中传递显式null时,会插入当前日期时间,这是意外的。为什么会这样?
注意:Hibernate使用第二种类型的插入,因此它成为一个问题。如何将null插入时间戳列?
答案 0 :(得分:31)
http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html
此外,您可以通过为任何TIMESTAMP列分配NULL值来初始化或更新任何TIMESTAMP列,除非已使用NULL属性定义允许NULL值。
答案 1 :(得分:11)
创建表格:
create table penguins(id int primary key auto_increment, the_time timestamp NULL);
插入一些行:
insert into penguins(the_time) values (now());
insert into penguins(the_time) values (null);
insert into penguins(the_time) values (0);
insert into penguins(the_time) values ('1999-10-10 01:02:03');
打印:
select * from penguins
1 2015-01-23 15:40:36
2
3 0000-00-00 00:00:00
4 1999-10-10 01:02:03
第二行中名为the_time
且数据类型为timestamp
的列的值为NULL。
答案 2 :(得分:4)
您需要更改hireDate列的默认值。默认值应为null
这个
create table temp(id int, hireDate timestamp default 0);
应该是这样的:
create table temp(id int, hireDate timestamp null);
答案 3 :(得分:1)
从不将任何应用程序值存储到MySQL时间戳类型列中。 仅将时间戳类型用于数据库服务器端动态时间戳记(请参阅DEFAULT和ON UPDATE列属性)。 通过调用列“ mysql_row_created_at”和“ mysql_row_updated_at”使之明确。
请注意,MySQL物理上将其时间戳类型存储为数字UNIX-epoch-delta,因此它具有UTC的隐式时区,因此不受会话(AKA连接)级别时区更改的影响。
在存储具有已知时区的任何值时,请远离'datetime'类型。 “日期时间”类型很像一串打包数字。没有存储任何时区详细信息。
通常可以很好地使用'date'类型。请注意,尽管在某些情况下,它将被解释为(活动时区的)午夜的日期时间,这将导致您应避免的所有与“日期时间”相关的混乱。
对于任何应用程序端日期时间值,请使用“ int unsigned”,“ bigint”(带符号),“ double”(带符号)或十进制(N,P)来存储UNIX-时代三角洲。 如果不是秒,请确保在列名后缀中显示分辨率。
示例:
`mysql_row_created_at` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
`mysql_row_updated_at` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`epoch` int unsigned NOT NULL,
`epoch_ms` bigint NOT NULL,
`epoch_us` bigint NOT NULL,
`epoch` double NOT NULL,
`epoch6` decimal(16,6),
尽可能多地处理数据库。因此,仅在应用程序端进行任何转换,而在数据库端则不会。
很高兴知道:
SELECT @@GLOBAL.TIME_ZONE
, @@SESSION.TIME_ZONE
, @@SESSION.TIMESTAMP
, UNIX_TIMESTAMP(NOW(6))
;
答案 4 :(得分:0)
如果要在表的hireDate
列中插入NULL,则必须提供null
INSERT INTO temp (id, hireDate) VALUES(3, null);
由于Datatype
的{{1}}为hireDate
,因此在创建列时应将其定义为null