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

Как хранить значения 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 или вообще оставить его вне запроса на обновление, чтобы избежать этой ошибки? Я прав? Спасибо!!!

4b9b3361

Ответ 1

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] при привязке NULL. См. fooobar.com/questions/63763/... о том, как правильно вставить NULL с помощью PDO.

Ответ 2

Это разумная точка.

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

В нулевой дате "... где mydate = ''" не будет выполнено.
В пустой/нулевой дате "... где mydate is null" не удастся.

Но теперь давайте фанки. В датах mysql пустая/нулевая дата строго одинакова.

на примере

select if(myDate is null, 'null', myDate) as mydate from myTable where  myDate = '';
select if(myDate is null, 'null', myDate) as mydate from myTable where  myDate = '0000-00-00 00:00:00'

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

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

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

пустые даты проще в php/mysql. У вас нет поля "where field null" для обработки. Однако вам нужно "вручную" преобразовать дату '0000-00-00 00:00:00' в '' для отображения пустых полей. (для хранения или поиска у вас нет специального случая для обработки нулевых дат, что приятно).

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

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

Ответ 3

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

create table MyTable (col1 datetime NOT NULL);

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

create table MyTable (col1 datetime NULL);

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

Ответ 4

У меня была проблема с окнами.

Это решение:

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

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

Ответ 5

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

Ответ 6

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

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

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

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

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

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

Ответ 7

Для чего это стоит: у меня возникла аналогичная проблема, пытающаяся обновить таблицу 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]);
    ...

Ответ 8

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

if(empty($odate) AND empty($ddate))
{
  $query2="UPDATE items SET odate=null, ddate=null, istatus='$istatus' WHERE id='$id' ";
};