Wenn ich einen Nullwert in der Datumsspalte anlege, erhalte ich den Wert "1900-01-01 00: 00: 00.000" in meiner Tabelle und erwarte NULL in dieser Spalte. Da dies in jdbc richtig gehandhabt wird, wenn ich das so setze
%Vor%log4j2.xml
%Vor%Datentyp der Spalten startdate und enddate ist datetime
%Vor%Das gleiche gilt für String mit Nullwert.
Einfügen von null
Ich denke nicht, dass es möglich ist, null
in irgendeine Spalte irgendeines Typs zu bekommen, indem JDBCAppender
mit solchen Mustern verwendet wird.
Dieser Thread < vor einigen Jahren aufgetaucht, gefolgt von diesem Jira-Problem . Nichts davon scheint Aufmerksamkeit erregt zu haben.
Die kurze Version ist, dass ein StringBuilder
zwischen Muster und vorbereiteter Anweisung verwendet wird, und daher bekommt INSERT
immer eine Nicht-Null-Zeichenfolge, auch wenn (in Ihrem Beispiel) null
der Wert in% ist. Code%. Es ist also möglich, eine leere Zeichenfolge oder die Zeichenfolge ThreadContext
einzufügen, aber es scheint nicht möglich zu sein, den Wert "null"
einzufügen.
1. Januar 1900
Wenn ich Ihr Beispiel für eine MySQL-Datenbank ausführe, ist die Einfügung fehlgeschlagen, weil MySQL nicht weiß, wie man eine null
aus einer leeren Zeichenfolge erstellt.
Ich nehme an, dass Sie SQL Server verwenden, der eine leere Zeichenfolge gerne in DATETIME
umwandelt, weil natürlich das ist, was Sie meinten.
Unabhängig von der von Ihnen verwendeten Datenbank füllt 1900-01-01 00:00:00.000
die JDBCAppender
-Anweisung mit Nicht-Null-Strings. Was von dort passiert, wird von DB zu DB variieren.
Warum?
Zunächst mag es seltsam erscheinen, dass das Framework Ihren Wert ( INSERT
) auf einen anderen Wert (leere Zeichenfolge) ändert. Im Kern besteht die Protokollierung jedoch aus Zeichenfolgen.
Ja, es gibt einen Appender, der diese Zeichenfolgen in eine Datenbank schreibt. Und ja, Ihre Datenbank kann wiederum diese Strings in Typen wie null
oder DATETIME
lenken. Aber bei jedem Appender geht es nur darum, Strings zu manipulieren und auszugeben.
Mögliche Problemumgehung
Wenn Sie INTEGER
wirklich mit null
in die Datenbank importieren möchten, können Sie möglicherweise einen Trigger schreiben .
Letzte Beobachtung
Nicht sicher, ob das hilft, aber ich kann auch alle meine Ergebnisse präsentieren:
Wenn Sie JDBCAppender
anstelle von ColumnMapping
in Ihrer log4j-Konfiguration verwenden, können Sie einen Klassennamen angeben. Die Anwesenheit (oder Abwesenheit) und der Wert dieses Klassennamens ändern den Wert, der in die Datenbank eingefügt wird. Zum Beispiel mit SQL Server Express 2014:
Führt dazu, dass das aktuelle Datum und die Uhrzeit protokolliert werden, wenn Column
anstelle von 1900-01-01 null ist. Wenn Sie stattdessen startdate
verwenden, wird das aktuelle Datum ohne Zeitangabe protokolliert.