Problem mit LOAD DATA INFILE

Problem mit LOAD DATA INFILE

am 24.10.2007 13:18:07 von Jens Riedel

Hallo,

ich bin mit einer Anwendung von einer 4er auf eine 5er MySQL umgezogen.
Jetzt funktioniert ein LOAD DATA INFILE nicht mehr, welches mit
folgendem Infile gefüttert wird:

"1","10040","10030","2006-03-10
17:35:21.635","635000000","0","125.0",NULL,NULL,
"1","10040","10030","2006-03-10
17:37:01.782","782000000","0","47.0",NULL,NULL,
"1","10041","10031","2006-03-10
17:35:21.86","860000000","0","78.0",NULL,NULL,
"1","10040","10030","2006-03-10
17:35:21.907","907000000","0","47.0",NULL,NULL,
"1","10041","10031","2006-03-10
17:35:21.954","954000000","0","47.0",NULL,NULL,
"1","10041","10031","2006-03-10
17:35:22.032","32000000","0","78.0",NULL,NULL,
"1","10041","10031","2006-03-10
17:35:22.291","291000000","0","47.0",NULL,NULL,

(Zeilenumbrüche im Datumsfeld bitte wegdenken.

Damals auf der 4er MySQL musste ich ein wenig rumprobieren, die Sache
klappte erst, wenn am Ende der Zeile (hinter dem 2. NULL) noch ein Komma
stand.

Auf der 5er bekomme ich mit abschließenden Kommas den Fehler, dass die
Zeile ein Element zuviel enthält. Ist noch kein Problem, die kann ich ja
wegnehmen.

Dann aber kriege ich die Meldung, dass für die letzten beiden Spalten
(sind DECIMAL(10,3)-Felder) NULL kein korrekter Wert ist.
NULL ist für diese Spalten aber definitiv erlaubt. Wie kriege ich die
NULL-Werte denn sonst da rein?

Danke und Gruß,
Jens

Re: Problem mit LOAD DATA INFILE

am 24.10.2007 13:33:58 von Claus Reibenstein

Jens Riedel schrieb:

> Jetzt funktioniert ein LOAD DATA INFILE nicht mehr, welches mit

Und wie sieht dieses LOAD DATA INFILE aus?

> Dann aber kriege ich die Meldung, dass für die letzten beiden Spalten
> (sind DECIMAL(10,3)-Felder) NULL kein korrekter Wert ist.
> NULL ist für diese Spalten aber definitiv erlaubt. Wie kriege ich die
> NULL-Werte denn sonst da rein?

FIELDS ENCLODES BY '"' fehlt.

Gruß. Claus

Re: Problem mit LOAD DATA INFILE

am 24.10.2007 14:01:47 von Jens Riedel

Hallo Claus,

hast Recht, waren ein bisschen dürftige Angaben. Hier also mein Kommando:

LOAD DATA INFILE 'D:/meinFile.txt'
INTO TABLE MY_TABLE
FIELDS TERMINATED BY ',' ENCLOSED BY '"'

Den File-Inhalt hab ich mal mit der entsprechenden SELECT INTO
OUTFILE-Anweisung erstellt:

SELECT CLIENT_ID, MONITOR_ID, INSTANCE_ID, MEASTIME, NANOS, RETURN_CODE,
VALUE, LIMIT1, LIMIT2 from MY_TABLE
into OUTFILE 'D:/meinFile.txt'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'


Da krieg ich dann sowas raus:

"1","2","3","2007-10-24 10:12:13","123456","1","349.000",\N,\N

Wenn ich dies dann wieder als Basis für's LOAD DATA INFILE nehme,
bekomme ich aber die Meldung "Incorrect decimal value: 'NULL' for column
'LIMIT1' at row 1".

Wenn ich Zahlen reinschreibe, klappt es, allerdings bei den letzten
beiden nur wenn ich sie NICHT in "" schreibe, das drittletzte MUSS aber
in "" stehen, sonst schepperts - dabei sind alle 3 vom Type DECIMAL(10,3).

Gruß,
Jens

Re: Problem mit LOAD DATA INFILE

am 24.10.2007 16:17:47 von Sven Paulus

Jens Riedel wrote:
> Wenn ich Zahlen reinschreibe, klappt es, allerdings bei den letzten
> beiden nur wenn ich sie NICHT in "" schreibe, das drittletzte MUSS aber
> in "" stehen, sonst schepperts - dabei sind alle 3 vom Type DECIMAL(10,3).

Zeig doch mal den CREATE TABLE der Tabelle.

Re: Problem mit LOAD DATA INFILE

am 24.10.2007 18:00:51 von Jens Riedel

Sven Paulus schrieb:

> Zeig doch mal den CREATE TABLE der Tabelle.

CREATE TABLE `MY_TABLE` (
`CLIENT_ID` int(11) default '1',
`MONITOR_ID` int(11) default NULL,
`INSTANCE_ID` int(11) default NULL,
`MEASTIME` datetime default NULL,
`NANOS` int(11) default NULL,
`RETURN_CODE` int(11) default NULL,
`VALUE` decimal(10,3) default NULL,
`LIMIT1` decimal(10,3) default NULL,
`LIMIT2` decimal(10,3) default NULL,
KEY `monitor` (`MONITOR_ID`,`INSTANCE_ID`),
KEY `MY_TABLE_IDX1` (`CLIENT_ID`,`MONITOR_ID`,`INSTANCE_ID`,`MEASTIME`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Komisch ist folgendes: importiere ich folgenden Satz

"1","10006","10013","2007-10-24
12:11:38.109","109000000","0","349.0",NULL,NULL

wird gemeckert, dass NULL kein Dezimal-Wert für LIMIT2 ist - es wird
also nur der zweite NULL-Wert zurückgewiesen. Ändere ich diesen z.B. so


"1","10006","10013","2007-10-24
12:11:38.109","109000000","0","349.0",NULL,10.0

wird die 10 korrekt in LIMIT2 und NULL korrekt in LIMIT1 geschrieben...
scheint also damit zu tun zu haben, dass die Kombination NULL / letztes
Feld der Zeile Probleme macht.

Gruß,
Jens

Re: Problem mit LOAD DATA INFILE

am 24.10.2007 18:18:19 von Jens Riedel

Jens Riedel schrieb:

>...

> wird die 10 korrekt in LIMIT2 und NULL korrekt in LIMIT1 geschrieben...
> scheint also damit zu tun zu haben, dass die Kombination NULL / letztes
> Feld der Zeile Probleme macht.

Ich hab's jetzt so gelöst, dass ich alles in eine Zeile getrennt durch
';' ballere und LINES TERMINATED BY ';' setze... dann haut es hin.

Re: Problem mit LOAD DATA INFILE

am 24.10.2007 23:06:46 von B.Steinbrink

On Wed, 24 Oct 2007 18:18:19 +0200, Jens Riedel wrote:

> Jens Riedel schrieb:
>
> >...
>
>> wird die 10 korrekt in LIMIT2 und NULL korrekt in LIMIT1 geschrieben...
>> scheint also damit zu tun zu haben, dass die Kombination NULL / letztes
>> Feld der Zeile Probleme macht.
>
> Ich hab's jetzt so gelöst, dass ich alles in eine Zeile getrennt durch
> ';' ballere und LINES TERMINATED BY ';' setze... dann haut es hin.

CSV Datei mit Windows erstellt? Dann hast du wahrscheinlich CR/LF
Zeilenenden, MySQL erwartet aber standardmäßig nur LF, d.h. dein "NULL\r
\n" am Ende wird als Wert für das Feld ein "NULL\r" generieren und dass
ist definitiv kein gültiger Dezimalwert ;-)

Siehe erster, eingerückter "Note" Absatz auf:
http://dev.mysql.com/doc/refman/5.0/en/load-data.html

Björn