将NULL插入MySQL时间戳

时间:2012-09-19 05:31:45

标签: mysql sql database hibernate

我在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插入时间戳列?

5 个答案:

答案 0 :(得分:31)

http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html

  

此外,您可以通过为任何TIMESTAMP列分配NULL值来初始化或更新任何TIMESTAMP列,除非已使用NULL属性定义允许NULL值。

答案 1 :(得分:11)

您可以在MySQL时间戳中插入和更新NULL。

创建表格:

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