Как хранить значения NULL в полях datetime в MySQL?

У меня есть поле "bill_date", которое я хочу оставить пустым (NULL), пока не будет выставлен счет, после чего будет введена дата.

Я вижу, что MySQL не любит значения NULL в полях datetime. У кого-нибудь из вас есть простой способ справиться с этим, или я вынужден использовать минимальную дату как «эквивалент NULL», а затем проверить эту дату?

Спасибо.

ИЗМЕНЕНО ДЛЯ ДОБАВЛЕНИЯ:

Хорошо, я вижу, что MySQL примет значение NULL, но не примет его как обновление базы данных, если я обновляю запись с помощью PHP.

Имя переменной есть, $bill_dateно оно не будет иметь значение NULL, если я обновлю запись, не отправив значение в $bill_date- я получаю эту ошибку:

Database query failed: Incorrect datetime value: '' for column 'bill_date' at row 1

Я предполагаю, что мне нужно отправить слово NULL или вообще исключить его из запроса на обновление, чтобы избежать этой ошибки? Я прав? Спасибо!!!

6.11.2009 23:01:21
MySQL DOES принимает нулевые значения для определения даты и времени, но если по какой-то причине вы думаете иначе и не будете использовать нулевое значение, попробуйте просто использовать «1000-01-01» в качестве значения и исключить строки, которые имеют это значение для вашего bill_date столбец в ваших запросах.
BraedenP 6.11.2009 23:08:24
Mysql допускает пустые значения в полях datetime. Я подозреваю, что проблема связана с тем, как вы получаете доступ к MySQL. Не могли бы вы отредактировать свой вопрос с помощью механизма, который вы используете для доступа к данным? Например, вы используете мой ODBC, библиотеку Perl и т. Д.?
anschauung 6.11.2009 23:08:24
Использование PHP - см. Мои правки выше.
rhodesjason 9.11.2009 15:03:24
Используйте NULL (без единой косой черты) вместо '' в ваших запросах, чтобы добавить значение NULL в поле datetime.
Heitor 1.03.2017 04:21:09
8 ОТВЕТОВ
РЕШЕНИЕ

MySQL делает позволяют NULLзначения для datetimeполей. Я только что проверил это:

mysql> create table datetimetest (testcolumn datetime null default null);
Query OK, 0 rows affected (0.10 sec)

mysql> insert into datetimetest (testcolumn) values (null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from datetimetest;
+------------+
| testcolumn |
+------------+
| NULL       | 
+------------+
1 row in set (0.00 sec)

Я использую эту версию:

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.0.45    | 
+-----------+
1 row in set (0.03 sec)

РЕДАКТИРОВАТЬ # 1: Я вижу в ваших правках, что сообщение об ошибке, которое вы получаете в PHP, указывает на то, что вы передаете пустую строку (т.е. ''), а не null. Пустая строка отличается от nullи не является допустимым datetimeзначением, поэтому вы получаете это сообщение об ошибке. Вы должны передать специальное ключевое слово sql, nullесли это то, что вы имеете в виду. Кроме того, не ставьте кавычки вокруг слова null. Смотрите мое insertутверждение выше для примера того, как вставить null.

РЕДАКТИРОВАНИЕ № 2: Вы используете PDO? Если это так, когда вы связываете свой нулевой параметр, обязательно используйте [PDO::PARAM_NULL][1]тип при связывании a null. Посмотрите ответ на этот вопрос stackoverflow о том, как правильно вставить nullс помощью PDO.

53
23.05.2017 11:55:02
@ Джейсон Роудс: Хорошо, я обновил свой ответ, чтобы исправить ваши правки. Если вы все еще не можете заставить его работать, пожалуйста, опубликуйте свой код PHP.
Asaph 9.11.2009 16:38:02
@ Джейсон Роудс: я включил несколько советов, которые могут быть полезны, если вы используете PDO.
Asaph 9.11.2009 16:51:18
Я догадываюсь, что имеет смысл. Я не использую PDO (и на самом деле не знаю, что это такое!). Я не могу передать NULL легко, потому что я использую стандартный метод объекта для обновления. Мне нужно переделать некоторые вещи.
rhodesjason 9.11.2009 22:50:05

Я только что проверил в MySQL v5.0.6 и столбец datetime принял значение null без проблем.

2
6.11.2009 23:04:53

Это зависит от того, как вы объявите свою таблицу. NULL не будет разрешен в:

create table MyTable (col1 datetime NOT NULL);

Но это будет разрешено в:

create table MyTable (col1 datetime NULL);

Вторым является значение по умолчанию, поэтому кто-то, должно быть, активно решил, что столбец не должен быть обнуляемым.

3
6.11.2009 23:16:15

Это разумный момент.

Нулевая дата не является нулевой датой. Они могут выглядеть одинаково, но это не так. В mysql нулевое значение даты является нулевым. Нулевое значение даты - пустая строка ('') и '0000-00-00 00:00:00'

В нулевую дату "... где mydate = ''" потерпит неудачу.
В пустую / нулевую дату "... где mydate равен нулю" потерпит неудачу.

Но теперь давайте напугаться. В mysql даты пустая / нулевая дата строго совпадают.

по примеру

выберите if (myDate равен нулю, 'null', myDate) как mydate из myTable, где myDate = '';
выберите if (myDate равен нулю, 'null', myDate) как mydate из myTable, где myDate = '0000-00-00 00:00:00'

ОБА будет выводить: «0000-00-00 00:00:00». если вы обновите myDate с помощью '' или '0000-00-00 00:00:00', оба варианта будут работать одинаково.

В php тип mysql с нулевыми датами будет соблюдаться с помощью стандартного соединителя mysql и будет действительным нулем ($ var === null, is_null ($ var)). Пустые даты всегда будут представлены как «0000-00-00 00:00:00».

Я настоятельно советую использовать только нулевые даты, ИЛИ только пустые даты, если вы можете. (некоторые системы будут использовать «виртуальные» нулевые даты, которые являются действительными григорианскими датами, например 1970-01-01 (linux) или 0001-01-01 (oracle)).

пустые даты легче в php / mysql. У вас нет «где поле является нулевым» для обработки. Однако для отображения пустых полей необходимо «вручную» преобразовать дату «0000-00-00 00:00:00» в «». (для хранения или поиска у вас нет особого случая для обработки нулевых дат, что хорошо).

Нулевые даты нуждаются в лучшем уходе. Вы должны быть осторожны, когда вставляете или обновляете, чтобы НЕ добавлять кавычки вокруг нуля, иначе вместо нуля будет вставлена ​​нулевая дата, что приведет к хаосу в ваших стандартных данных. В поисковых формах вам нужно будет обрабатывать такие случаи, как «и mydate не равен нулю» и так далее.

Нулевые даты обычно больше работы. но они гораздо гораздо гораздо быстрее , чем ноль дат для запросов.

22
15.08.2011 16:51:58

В частности, в связи с ошибкой, которую вы получаете, вы не можете сделать что-то подобное в PHP для обнуляемого поля в MySQL:

$sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . null . ')';

Потому что нуль в PHP будет приравниваться к пустой строке, которая не совпадает со значением NULL в MysQL. Вместо этого вы хотите сделать это:

$sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . (is_null($col2) ? 'NULL' : $col2). ')';

Конечно, вам не нужно использовать is_null, но я полагаю, что это немного лучше. Вероятно, безопаснее использовать empty () или что-то в этом роде. И если $ col2 окажется строкой, которую вы бы заключили в запрос в двойные кавычки, не забудьте не включать их в строку 'NULL', иначе это не сработает.

Надеюсь, это поможет!

1
22.02.2013 10:53:20
В первом примере вы могли бы просто сделать:$sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', null)';
Pere 17.06.2014 08:18:40

Для чего это стоит: у меня возникла похожая проблема при попытке обновить таблицу MySQL через Perl. Обновление завершится неудачно, когда пустое строковое значение (переведенное из нулевого значения из чтения с другой платформы) будет передано в столбец даты ('dtcol' в примере кода ниже). Я наконец-то успешно обновил данные, используя оператор IF, встроенный в мой оператор обновления:

    ...
    my $stmnt='update tbl set colA=?,dtcol=if(?="",null,?) where colC=?';
    my $status=$dbh->do($stmt,undef,$iref[1],$iref[2],$iref[2],$ref[0]);
    ...
2
5.08.2013 23:52:04

У меня была эта проблема на окнах.

Это решение:

Чтобы передать '' для NULL, вы должны отключить STRICT_MODE (который включен по умолчанию в установках Windows)

Кстати, это смешно, чтобы передать '' для NULL. Я не знаю, почему они допускают такое поведение.

7
20.08.2013 06:22:07
Для любого типа "нуб", спотыкающегося об этом, '' !== nullпросто работает в этом очень специфическом случае по какой-то причине.
ggdx 11.02.2019 11:09:15
Проблема с отключением строгого режима состоит в том, что значения, которые являются слишком длинными для поля, больше не вызывают ошибку и вместо этого просто усекаются. Потенциальный риск для этого следует учитывать перед отключением строгого режима.
Vincent 16.01.2020 21:27:01

Я только что обнаружил, что MySQL будет принимать значение NULL при условии, что значение по умолчанию для поля равно NULL, и я пишу конкретные операторы if и опускаю кавычки. Это работает и для обновления.

if(empty($odate) AND empty($ddate))
{
  $query2="UPDATE items SET odate=null, ddate=null, istatus='$istatus' WHERE id='$id' ";
};
2
26.08.2015 14:30:51