Ich bekomme eine Ausnahme (siehe unten), wenn ich es versuche
resultset.getString("add_date");
für eine JDBC-Verbindung zu einer MySQL-Datenbank mit einem DATETIME-Wert von 0000-00-00 00:00:00 (dem Quasi-Null-Wert für DATETIME), obwohl ich nur versuche, den Wert als Zeichenfolge und nicht als Zeichenfolge abzurufen Objekt.
Ich habe das umgangen
SELECT CAST(add_date AS CHAR) as add_date
was funktioniert, aber albern erscheint ... gibt es einen besseren Weg, dies zu tun?
Mein Punkt ist, dass ich nur die rohe DATETIME-Zeichenfolge möchte, damit ich sie selbst analysieren kann, wie sie ist .
Hinweis: Hier kommt der 0000 ins Spiel: (von http://dev.mysql.com/doc/refman/5.0/en/datetime.html )
Unzulässige DATETIME-, DATE- oder TIMESTAMP-Werte werden in den Wert „Null“ des entsprechenden Typs ('0000-00-00 00:00:00' oder '0000-00-00') konvertiert.
Die spezifische Ausnahme ist diese:
SQLException: Cannot convert value '0000-00-00 00:00:00' from column 5 to TIMESTAMP.
SQLState: S1009
VendorError: 0
java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 5 to TIMESTAMP.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ResultSetImpl.getTimestampFromString(ResultSetImpl.java:6343)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5670)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5491)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5531)
Alternative Antwort: Sie können diese JDBC-URL direkt in Ihrer Datenquellenkonfiguration verwenden:
Bearbeiten:
Quelle: MySQL-Handbuch
Update: Alexander hat einen Fehler gemeldet, der mysql-connector-5.1.15 für diese Funktion betrifft. Siehe CHANGELOGS auf der offiziellen Website .
quelle
Das lässt mich denken, dass Ihre "Problemumgehung" keine Problemumgehung ist, sondern tatsächlich die einzige Möglichkeit, den Wert aus der Datenbank in Ihren Code zu übernehmen:
Übrigens noch ein paar Hinweise aus der MySQL-Dokumentation:
MySQL- Einschränkungen für ungültige Daten :
MySQL 5.x Datums- und Uhrzeittypen :
quelle
Verwenden Sie dies, um den Fehler zu vermeiden. Es gibt das Datum im Zeichenfolgenformat zurück und kann dann als Zeichenfolge abgerufen werden.
Das funktioniert eigentlich NICHT. Auch wenn Sie getString aufrufen. Intern versucht MySQL immer noch, es zuerst auf das Datum zu konvertieren.
quelle
Wenn nach dem Hinzufügen von Zeilen:
bleibt weiterhin ein Fehler:
Zeilen finden:
durch folgende Zeilen ersetzen:
quelle
Ich habe mit diesem Problem gerungen und die oben diskutierten 'convertToNull'-Lösungen implementiert. Es hat in meiner lokalen MySql-Instanz funktioniert. Aber wenn ich meine Play / Scala-App für Heroku bereitstellte, funktionierte sie nicht mehr. Heroku verkettet auch mehrere Argumente mit der DB-URL, die sie Benutzern und dieser Lösung zur Verfügung stellen, da Heroku die Verkettung von "?" vor ihren eigenen Argumenten wird nicht funktionieren. Ich habe jedoch eine andere Lösung gefunden, die genauso gut zu funktionieren scheint.
SET sql_mode = 'NO_ZERO_DATE';
Ich habe dies in meine Tabellenbeschreibungen aufgenommen und es hat das Problem gelöst, dass '0000-00-00 00:00:00' nicht als java.sql.Timestamp dargestellt werden kann
quelle
Ich schlage vor, Sie verwenden null, um einen Nullwert darzustellen.
Was ist die Ausnahme, die Sie bekommen?
Übrigens:
Es gibt kein Jahr mit dem Namen 0 oder 0000. (Obwohl einige Daten dieses Jahr zulassen)
Und es gibt keinen 0 Monat des Jahres oder 0 Tag des Monats. (Was kann die Ursache Ihres Problems sein)
quelle
Ich habe das Problem gelöst, da '00 -00 -.... 'kein gültiges Datum ist. Dann habe ich meine SQL-Spaltendefinition geändert und den Ausdruck "NULL" hinzugefügt, um Nullwerte zuzulassen:
Dann muss ich in der Lage sein, NULL-Werte einzufügen, das heißt "Ich habe diesen Zeitstempel noch nicht registriert" ...
Die Tabelle sieht so aus:
Endlich: JPA in Aktion:
Endlich seine ganze Arbeit. Ich hoffe das hilft dir.
quelle
So fügen Sie die anderen Antworten hinzu: Wenn Sie die
0000-00-00
Zeichenfolge möchten , können Sie sie verwendennoDatetimeStringSync=true
(mit der Einschränkung, die Zeitzonenumwandlung zu opfern).Der offizielle MySQL-Fehler: https://bugs.mysql.com/bug.php?id=47108 .
Auch für Geschichte, verwendet JDBC zurückzukehren
NULL
für0000-00-00
Termine , aber jetzt eine Ausnahme von Standard zurück. Quellequelle
Sie können die JDBC-URL mit anhängen
Mit dieser Hilfe konvertiert SQL '0000-00-00 00:00:00' als Nullwert.
z.B:
quelle