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.
Leave A Comment