MySQL, как вводить нулевые даты

У меня возникли проблемы с введением нулевых значений в поля даты в таблицу MySQL.

Вот запрос вставки:

$query = 'INSERT INTO table (column_s1, column_s2, column_d1, column_d2) VALUES ("'.$string1.'", "'.$string2.'", '.$date1.', '.$date2.')'; 

Столбцы s1 и s2 принимают строковые значения, а d1 и d2 принимают даты. Когда я запускаю этот запрос только с полями строк, проблем нет.

Значения даты могут быть либо заданными, либо нулевыми, поэтому я не включил кавычки в запрос, а вместо этого добавил их к переменной ранее. Это код php, который я использую для установки значений даты:

 if (empty($date1)){ $date1 = NULL; } else{ $date1part = explode("/",$date1); $date1 = '"'.$date1part[2].'/'.$date1part[1].'/'.$date1part[0].'"'; } 

Когда все значения даты установлены, запись вставлена ​​правильно. Однако, когда любая из дат равна нулю, ничего не вставлено.

Почему я не могу просто вставить нулевые значения в MySQL?

Вы должны преобразовать нулевую переменную в строку NULL сначала. Вот так:

 if(is_null($date1)){ $date1 = 'NULL'; } 

Если вы используете столбец даты MySQL, вы также должны указать, что он должен содержать null при его создании, например:

 CREATE TABLE `table` ( id INT NOT NULL AUTO_INCREMENT, date DATE NULL DEFAULT NULL, PRIMARY KEY(id) ) 

Также очень важно, чтобы вы выполняли запрос с привязанными параметрами, например, используя pdo

  1. http://www.php.net/manual/en/pdo.construct.php
  2. http://php.net/manual/en/pdo.prepared-statements.php
  3. Как вставить значения NULL с помощью PDO?

Что-то вроде этого:

 $query = 'INSERT INTO table (column_s1, column_s2, column_d1, column_d2) VALUES (?, ?, ?, ?)'; $stmt = $db->prepare($query); $stmt->execute(array($string1,$string2,$date1,$date2)); 

Попробуй это:

 $query = "INSERT INTO table (column_s1, column_s2, column_d1, column_d2) VALUES ('$string1', '$string2', " . ($date1==NULL ? "NULL" : "'$date1'") . ", " . ($date2==NULL ? "NULL" : "'$date2'") . ");"; 

так, например, если вы поместите это в запрос:

 $string1 = "s1"; $string2 = "s2"; $date1 = NULL; $date2 = NULL; 

результатом должно быть:

 INSERT INTO table (column_s1, column_s2, column_d1, column_d2) VALUES ('s1', 's2', NULL, NULL); 

Обратная косая черта N – еще один способ выражения NULL в MySQL.

Попробуйте поместить значение (обратная косая черта N): \N в один из следующих параметров:

 $data1 = "\N"; $sql="insert into tablename set column_s1='" . $data1 . "', column_s2='" . data2 . "', column_s3='" . $data3 . "'"; 

Ссылка: http://dev.mysql.com/doc/refman/5.1/ru/load-data.html

В Derby, если вы хотите вставить значения, кроме тех, которые вы объявили Null (column_d1, column_d2), sql:

 INSERT INTO DB.table (column_s1, column_s2) VALUES ('s1', 's2'); 

Вероятно, ответ в данный момент не нужен, но я нашел решение, которое я искал. Используйте Expression для передачи NULL следующим образом:

 ['some_date_to_update' => new Expression('NULL')] 

Следовательно, MySQL будет понимать, что вы хотите, и сохранять (NULL) в БД вместо хранения 0-дат. Надеюсь, это поможет кому-то.