Wie wird mit null verfahren, wenn das Datum in log4j2 jdbcpender gesetzt wird?

8

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.

    
happy 30.11.2017, 12:07
quelle

1 Antwort

2

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:

%Vor%

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.

    
Mike Patrick 06.12.2017 01:46
quelle

Tags und Links