← Alle Artikel

MySQL Date NOT NULL DEFAULT ‚0000-00-00‘

Im Gegensatz zu PostgreSQL ist in der MySQL Version 5.6.36 ein Tabellenfeld mit dieser Definition zulässig:

Feldname Typ Null Defaultwert
id Int No auto_increment
date Date No 0000-00-00

Der Wert 0000-00-00 ist kein valides Datumsformat, wird von MySQL trotzdem akzeptiert.

INSERT INTO foo (date) VALUES ('0000-00-00'); ✅ 
INSERT INTO foo (date) VALUES ('NULL'); ✅
INSERT INTO foo (date) VALUES ('2000-00-00); ✅
INSERT INTO foo (date) VALUES (NULL); ❌

In einem MySQL-Tool (ausser IntelliJ, dafür aber z.B. SequelPro, MySQLWorkbench oder PHPMyAdmin) werden folgende Ergebnisse geliefert:

SELECT * FROM foo;
id date
1 0000-00-00
2 0000-00-00
3 2000-00-00
 SELECT * FROM foo WHERE date IS NULL;
id date
1 0000-00-00
2 0000-00-00
3 2000-00-00
 SELECT * FROM foo WHERE date IS NOT NULL;
id date
1 0000-00-00
2 0000-00-00
3 2000-00-00

In dem Datenbanken-Tool der Entwicklungsumgebung IntelliJ von JetBrains werden andere Ergebnisse geliefert. Sie sehen wie folgt aus:

SELECT * FROM foo;
id date
1 <null>
2 <null>
3 1999-11-30
 SELECT * FROM foo WHERE date IS NULL;
id date
1 <null>
2 <null>
 SELECT * FROM foo WHERE date IS NOT NULL;
id date
1 <null>
2 <null>
3 1999-11-30

Der Grund für diese Abweichung liegt in der Implementierung von IntelliJ. Die Entwicklungsumgebung basiert auf Java und nutzt einen JDBC (Java Database Connectivity) Treiber. Der JDBC versucht das invalide Datum zu verstehen, kann es aber nicht und mit der standardmäßigen Einstellung jdbc:mysql://yourserver:3306/yourdatabase?zeroDateTimeBehavior=convertToNull wird der nicht zu verstehende Wert in den Wert null konvertiert. Das ist auch der Grund dafür, weshalb das invalide Datum 2000-00-00 zu einem validen Datum 1999-11-30 umgeformt wird.

// Nächster Schritt

Ähnliches Problem im eigenen Projekt?

Ich helfe gern weiter – schreiben Sie mir einfach, worum es geht.