webentwicklung-frage-antwort-db.com.de

MySQL lädt NULL-Werte aus CSV-Daten

Ich habe eine Datei, die 3 bis 4 Spalten mit numerischen Werten enthalten kann, die durch Komma getrennt sind. Leere Felder werden mit der Ausnahme definiert, dass sie sich am Ende der Zeile befinden:

1,2,3,4,5
1,2,3,,5
1,2,3

Die folgende Tabelle wurde in MySQL erstellt:

 + ------- + -------- + ------ + ----- + --------- + ---- --- + 
 | Feld | Typ | Null | Schlüssel | Standard | Extra | 
 + ------- + -------- + ------ + ----- + --------- + - ----- + 
 | eine | int (1) | JA | | NULL | | 
 | zwei | int (1) | JA | | NULL | | 
 | drei | int (1) | JA | | NULL | | 
 | vier | int (1) | JA | | NULL | | 
 | fünf | int (1) | JA | | NULL | | 
 + ------- + -------- + ------ + ----- + --------- + ---- --- + 

Ich versuche, die Daten mit dem MySQL LOAD-Befehl zu laden:

LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS 
TERMINATED BY "," LINES TERMINATED BY "\n";

Die resultierende Tabelle:

 + ------ + ------ + ------- + ------ + ------ + 
 | eine | zwei | drei | vier | fünf | 
 + ------ + ------ + ------- + ------ + ------ + 
 | 1 | 2 | 3 | 4 | 5 | 
 | 1 | 2 | 3 | 0 | 5 | 
 | 1 | 2 | 3 | NULL | NULL | 
 + ------ + ------ + ------- + ------ + ------ + 

Das Problem liegt in der Tatsache, dass MySQL, wenn ein Feld in den Rohdaten leer und nicht definiert ist, aus irgendeinem Grund nicht den Spaltenstandardwert (der NULL ist) verwendet und Null verwendet. NULL wird korrekt verwendet, wenn das Feld vollständig fehlt.

Leider muss ich zu diesem Zeitpunkt in der Lage sein, zwischen NULL und 0 zu unterscheiden, daher wäre jede Hilfe willkommen.

Danke S.

bearbeiten

Die Ausgabe von SHOW WARNINGS:

 + --------- + ------ + --------------------------- ----------------------------- + 
 | Level | Code | Nachricht | 
 + --------- + ------ + ------------------------- ------------------------------- + 
 | Warnung | 1366 | Falscher ganzzahliger Wert: '' für Spalte 'vier' in Zeile 2 | 
 | Warnung | 1261 | Zeile 3 enthält nicht für alle Spalten Daten 
 | Warnung | 1261 | Zeile 3 enthält nicht für alle Spalten Daten 
 + --------- + ------ + --------------------------- ----------------------------- + 
157
Spiros

Dies wird tun, was Sie wollen. Das vierte Feld wird in eine lokale Variable eingelesen, und der tatsächliche Feldwert wird auf NULL gesetzt, wenn die lokale Variable eine leere Zeichenfolge enthält:

LOAD DATA infile '/tmp/testdata.txt'
INTO TABLE moo
fields terminated BY ","
lines terminated BY "\n"
(one, two, three, @vfour, five)
SET four = nullif(@vfour,'')
;

Wenn sie alle möglicherweise leer sind, würden Sie sie alle in Variablen einlesen und mehrere SET-Anweisungen haben, wie folgt:

LOAD DATA infile '/tmp/testdata.txt'
INTO TABLE moo
fields terminated BY ","
lines terminated BY "\n"
(@vone, @vtwo, @vthree, @vfour, @vfive)
SET
one = nullif(@vone,''),
two = nullif(@vtwo,''),
three = nullif(@vthree,''),
four = nullif(@vfour,'')
;
175
Duncan Lock

MySQL Handbuch sagt:

Beim Lesen von Daten mit LOAD DATA INFILE werden leere oder fehlende Spalten mit '' aktualisiert. Wenn Sie einen NULL-Wert in einer Spalte wünschen, sollten Sie\N in der Datendatei verwenden. Unter bestimmten Umständen kann auch das wörtliche Wort „NULL“ verwendet werden.

Daher müssen Sie die Leerzeichen durch\N wie folgt ersetzen:

1,2,3,4,5
1,2,3,\N,5
1,2,3
122
Janci

Das Verhalten ist je nach Datenbankkonfiguration unterschiedlich. Im strikten Modus würde dies einen Fehler auslösen, ansonsten eine Warnung. Die folgende Abfrage kann zur Identifizierung der Datenbankkonfiguration verwendet werden.

mysql> show variables like 'sql_mode';
6
Dobi

Verarbeiten Sie Ihre Eingabe-CSV-Datei vorab, um leere Einträge durch\N zu ersetzen.

Versuchen Sie einen regulären Ausdruck: s/, /,\n,/g und s /, $ /,\N/g

Viel Glück.

2
Sam Goldman