LOAD DATA INFILE und UTF-8



  • Hallo,

    ich hab mal wieder ein Problem mit Mysql. Speziell mit LOAD DATA INFILE.

    Ich habe eine CSV Datei die UTF-8 codiert ist. Meine Tabelle in welche die Datei geladen werden soll heißt "test" und hat zwei Felder:

    CREATE TABLE `test` (
    `name` VARCHAR(20) COLLATE utf8_general_ci DEFAULT NULL,
    `id` INTEGER(11) NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`id`)
    
    )ENGINE=InnoDB
    AUTO_INCREMENT=27 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
    

    In der CSV Datei stehen zwei Zeilen (zwei Datensätze).

    22,te€t
    23,test
    

    Jetzt versuch ich das ganze mit folgendem SQL Befehl in die Tabelle zu laden:

    LOAD DATA INFILE 'c:/temp/tempFile'
    REPLACE INTO TABLE test
    CHARACTER SET UTF8
    FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
    (id, name)
    

    Und folgender Fehler wird mir zurückgeliefert:

    Incorrect integer value: '22' for column 'id' at row 1
    

    Hat jemand eine Idee, warum der das nicht haben will?

    Vielen Dank für Hilfe und Tipps,
    MFG.



  • Kannst Du mal die Datei in einem Hex-Editor anschauen? Möglicherweise sind vor der ersten Zeile diese drei Zeichen angegeben, um intelligente Editoren zu sagen , dass die Datei utf8 kodiert ist. Ein Texteditor rafft das, der DB-Loader jedoch nich. Klappt es wenn Du die drei Zeichen entfernst?



  • Danke für den Hinweis. Ja, diese 3 Zeichen sind im Hex-Editor zu sehen.

    Ich schreibe die Datei automatisiert aus einem C Programm heraus.

    Jetzt stellt sich mir die Frage, wie ich den Output so umformen kann, dass eben genau diese 3 Zeichen nicht geschrieben werden.

    Vielleicht hast du dazu ja einen Tipp. Hier kurz der Code:

    FILE *tmpFile = _wfopen ( L"c:\\temp\\tempFile", L"w+,ccs=UTF-8" );
    
    wprintf(tmpFile, L"%d,%d\n", value1, value2); // beides int variablen
    
    fclose(tmpFile);
    

    mfg



  • Ich weiß nicht ob das Entfernen der Zeichen der richtige Weg ist. Teste es erstmal indem Du bei einer Datei das manuell entfernst und dann versuchst zu importieren. Dann kannst Du den nächsten Schritt machen.



  • Ja, also wenn ich die 3 Zeichen entferne, klappt der Import ohne Probleme.

    mfg



  • Ok, hab es nun so gelöst, dass als erste Zeile in das File ein Newline geschrieben wird und die Datensätze bei Zeile 2 beginnen.

    Mit der Option: IGNORE 1 LINES kann man MySQL ja dazu bringen, erst in Zeile 2 mit dem Import zu beginnen.

    Danke für die Hilfe.
    mfg


Anmelden zum Antworten