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

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 .

EDIT # 2: Вы используете PDO? Если это так, когда вы связываете свой нулевой параметр, не забудьте использовать тип [PDO::PARAM_NULL][1] при привязке null . См. Ответ на этот вопрос stackoverflow о том, как правильно вставить null используя PDO.

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

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

В нулевой дате «… где mydate = ''" не удастся.
На пустой / нулевой дате «… где mydate is null» завершится сбой.

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

по примеру

 выберите if (myDate - null, 'null', myDate) в качестве mydate из myTable, где myDate = '';
 выберите, если (myDate имеет значение null, 'null', myDate) в качестве mydate из myTable, где 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 is not null» и т. Д.

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

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

 create table MyTable (col1 datetime NOT NULL); 

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

 create table MyTable (col1 datetime NULL); 

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

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

Это решение:

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

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

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

В частности, что касается ошибки, которую вы получаете, вы не можете сделать что-то подобное в 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 является строкой, которую вы заключили в двойные кавычки в запросе, не забудьте не включать в нее строку вокруг строки «NULL», иначе она не будет работать.

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

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

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

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