web-dev-qa-db-fra.com

MySQL, comment insérer des dates nulles

Je ne parviens pas à insérer des valeurs NULL dans des champs de date dans une table MySQL. 

Voici la requête d'insertion:

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

Les colonnes s1 et s2 prennent des valeurs de chaîne et d1 et d2 prennent des dates. Lorsque je lance cette requête avec uniquement les champs de chaîne, il n'y a pas de problème.

Les valeurs de date peuvent être définies ou nulles. Je n'ai donc pas inclus les guillemets dans la requête, mais les ai ajoutés à la variable auparavant. C'est le code php que j'utilise pour définir les valeurs de date:

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

Lorsque toutes les valeurs de date sont définies, l’enregistrement est inséré correctement. Toutefois, lorsque l'une des dates est nulle, rien n'est inséré.

Pourquoi ne puis-je pas simplement insérer des valeurs NULL dans MySQL comme ceci?

10
apkdsmith

Vous devez d'abord convertir la variable null en chaîne NULLComme ceci:

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

Si vous utilisez une colonne de date MySQL, vous devez également spécifier qu'elle doit contenir la valeur null lors de sa création, comme ceci:

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

Il est également très important que vous exécutiez la requête avec des paramètres liés, par exemple en utilisant pdo.

  1. http://www.php.net/manual/en/pdo.construct.php
  2. http://php.net/manual/en/pdo.prepared-statements.php
  3. Comment insérer des valeurs NULL à l'aide de PDO?

Quelque chose comme ça:

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

Essaye ça:

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

ainsi, par exemple, si vous mettez ceci dans une requête:

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

le résultat devrait être:

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

La barre oblique inverse N est un autre moyen d’exprimer NULL dans MySQL. 

Essayez de mettre la valeur (barre oblique inverse N): \N dans l’un des paramètres suivants:

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

Référence: http://dev.mysql.com/doc/refman/5.1/fr/load-data.html

2
innovative kundan

Dans Derby, si vous souhaitez insérer des valeurs autres que celles que vous avez déclarées Null (column_d1, column_d2), sql:

INSERT INTO DB.table (column_s1, column_s2) VALUES ('s1', 's2');
1
Luis Daniel Dorta

si NULL pas de travail, passez simplement la date comme "0000-00-00"

$chequeDate = "0000-00-00";
1
Optimaz ID

La réponse est probablement inutile en ce moment, mais j'ai trouvé la solution que j'ai recherchée. Utilisez un Expression pour passer NULL comme ceci: 

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

Par conséquent, MySQL comprendra ce que vous voulez et enregistrera (NULL) dans la base de données au lieu de stocker les dates 0. J'espère que cela aidera quelqu'un.

1
Grokking

Dans le type de données Mysql DATE Par défaut NULL signifie 

Certaines versions sont définies comme 0000-00-00

Certaines versions sont définies comme 1970-01-01

0
Siva