Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z LOAD DATA INFILE
Forum PHP.pl > Forum > Bazy danych > MySQL
Liberator
Usiłuję załadować do tabeli dane z csv przy pomocy LOAD DATA INFILE.
Baza jest w utf-8, plik csv również.

Fragment pliku:
1|0|"Kurtki, ocieplacze"
2|0|"Bluzy, swetry"
3|0|"Koszulki, czapki"


Wykonałem takie zapytanie:
  1. LOAD DATA INFILE 'D:\/podkategorie.csv'
  2. INTO TABLE baza1.podkategorie
  3. CHARACTER SET 'utf8'
  4. FIELDS TERMINATED BY '|'
  5. LINES TERMINATED BY '\n\r'


Niestety pojawił się błąd odnośnie "CHARACTER SET..." - co wpisałem źle? Dokładnie taką opcję znalazłem w manualu. Bez tej opcji zapytanie się wykonuje, a w tabelce lądują krzaki.

Z góry dziękuję za pomoc.
Pozdrawiam,
nevt
skopiowałem twoje zapytanie i u mnie działa - spokojnie sprawdź, czy wszystko ci się zgadza (kodowanie bazy i plików, ilość i typy pól, nazwa bazy i tabeli...)
pokaż może też ten komunikat błędu co dostajesz, bo wg mnie nie powinien on mieć nic wspólnego ze składnią CHARACTER SET...
Liberator
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CHARACTER SET 'utf8'
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n\r'' at line 3

Najdziwniejsze jest to, że bez tego CHARACTER SET zapytanie nie zwraca żadnych błędów...
nevt
a nie brakuje ci gdzieś spacji miedzy kolejnymi liniami zapytania? pokaż ten string jak wygląda po stronie PHP... a jeżeli tego nie wołasz z PHP, to spróbuj wpisać całość w 1 linijce i ze średnikiem na końcu...
  1. LOAD DATA INFILE 'D:\/podkategorie.csv' INTO TABLE baza1.podkategorie CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n\r';
Liberator
ja to wpisuję "z palca" bezpośrednio w MySQL QueryBrowser
nevt
a jaką masz wersję MySQL Query i Serwera ? Bo u mnie kopia (dosłownie: skopiuj - wklej) hula w MySQL Browserze aż miło - specjalnie założyłem odpowiedni plik i tabelkę w bazie, że by nie poprawiać twojej składni...

EDIT: wg mojego manuala, CHARCTER SET hula w LOAD DATA INFILE dopiero od wersji 5.0.38 serwera MySQL

EDIT2: co do starszych wersji - As of MySQL 5.0.19, the character_set_filesystem system variable controls the interpretation of the filename.
Liberator
faktycznie smile.gif baza jest 5.0.27

Znajomy podesłał mi jeszcze inne rozwiązanie, polegające na zmianie domyślnego kodowania bazy smile.gif
Okazało się, że domyślna strona kodowa bazy:
  1. SHOW CREATE DATABASE NAZWA_BAZY

..to latin1. - a jedynie tabelki wszystkie były w utf8. Zmieniałem wczoraj co prawda kodowanie - ale całej instancji w my.cnf

Wykonałem więc:
  1. ALTER DATABASE NAZWA_BAZY CHARACTER SET utf8 COLLATE utf8_polish_ci;

i odpaliłem LOAD DATA INFILE bez CHARACTER SET 'utf8' i jest wszystko pięknie z ęąółćżź smile.gif

W jaki sposób używa się tego character_set_filesystem?
To jest jakaś zmienna zaszyta w plikach konf. ?

Napotkałem kolejny problem - kiedy próbuję w tym samym zapytaniu zdefiniować kolejność kolumn:
  1. LOAD DATA INFILE 'D:\prod.csv'
  2. INTO TABLE baza.tabela(kol1, kol2, kol3)
  3. FIELDS TERMINATED BY '|'
  4. LINES TERMINATED BY '\n\r'

błąd:

Script line: 1 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n\r'' at line 3

Bez podania kolejności kolumn w tym nawiasie dane są zaczynają być importowane, ale pojawia się błąd z niespełnieniem FK, bo w pliku dane są w złej kolejności.
nevt
wg składni w moim manualu lista pól powinna być na końcu polecenia, czyli:
  1. LOAD DATA INFILE 'D:\prod.csv'
  2. INTO TABLE baza.tabela
  3. FIELDS TERMINATED BY '|'
  4. LINES TERMINATED BY '\n\r' (kol1, kol2, kol3)
Liberator
Dziękuję bardzo smile.gif

Mam od razu pytanie o EKSPORT do csv smile.gif

Wykonuję:
  1. SELECT pole1,pol2 INTO OUTFILE '/tmp/result.csv'
  2. FIELDS TERMINATED BY '|'
  3. FROM tab1

niestety zawartość NULL jest zapisywana do pliku jako \N - co zrobić, żeby było tam zapisywane NULL albo nic; po prostu ||
nevt
  1. SELECT IFNULL(pole1, 'NULL'), IFNULL(pole2, 'NULL') ....
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.