Подтвердить что ты не робот

Вставка NULL в метку времени MySQL

Я наблюдаю непредвиденное поведение при вставке/обновлении NULL в столбце timestamp MySQL.

Рассмотрим следующие утверждения.

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

Первая вставка (когда hiredate не указана в SQL, ожидается, что leaseDate будет null(0).

Однако, когда явный null, переданный в SQL, вставляется текущее время даты, которое является неожиданным. Почему это происходит?

Примечание: Hibernate использует второй тип вставки и, следовательно, становится проблемой. Как вставить нуль в столбец временной метки?

4b9b3361

Ответ 1

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

Кроме того, вы можете инициализировать или обновить любой столбец TIMESTAMP до текущей даты и времени, присвоив ему значение NULL, если только оно не было определено атрибутом NULL, чтобы разрешать значения NULL.

Ответ 2

Вы можете вставлять и обновлять NULL в timestamp MySQL.

Создать таблицу:

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.

Ответ 3

Вам нужно изменить значение по умолчанию для столбца rentDate. Значение по умолчанию должно быть null

Это

create table temp(id int, hireDate timestamp default 0);

Должно быть:

create table temp(id int, hireDate timestamp null);

Ответ 4

если вы хотите вставить NULL в hireDate coloumn вашей таблицы, тогда вы должны указать null

INSERT INTO temp (id, hireDate) VALUES(3, null);

Потому что Datatype из hireDate - timestamp и он должен быть определен как null при создании столбца

Ответ 5

Никогда не сохраняйте значение приложения в столбце типа timestamp MySQL. Используйте тип timestamp только для динамической метки времени на стороне сервера базы данных (см. Атрибуты столбца DEFAULT и ON UPDATE). Сделайте это явным, вызывая столбцы "mysql_row_created_at" и "mysql_row_updated_at".

Имейте в виду, что MySQL физически сохраняет свой тип timestamp как числовую UNIX-эпоху-дельта, поэтому он имеет неявный часовой пояс UTC, что делает его невосприимчивым к изменениям часового пояса на уровне сеанса (AKA).

Держитесь подальше от типа "datetime", тем более, сохраняя любое значение, имеющее известный часовой пояс. Тип 'datetime' очень похож на строку упакованных чисел. С этим не сохраняется информация о часовых поясах.

Тип "дата" обычно подходит для использования. Имейте в виду, что в некоторых контекстах это будет интерпретироваться как дата-время в полночь (активного часового пояса), которое затем приведет ко всем связанным с этим недоразумениям, которые вам следует избегать.

Для любых значений даты и времени на стороне приложения используйте "int unsigned", "bigint" (подписанный), "двойной" (подписанный) или десятичный (N, P), чтобы просто хранить UNIX-epoch-deltas, Не забудьте показать разрешение в суффиксе имени столбца, если это не секунды.

Примеры:

'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))
;