Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z LOAD DATA INFILE, kodowanie
Liberator
post
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 10.09.2002
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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,

Ten post edytował Liberator 20.02.2008, 09:36:49
Go to the top of the page
+Quote Post
nevt
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
Liberator
post
Post #3





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 10.09.2002
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
nevt
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


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';


Ten post edytował nevt 20.02.2008, 13:08:38
Go to the top of the page
+Quote Post
Liberator
post
Post #5





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 10.09.2002
Skąd: Kraków

Ostrzeżenie: (0%)
-----


ja to wpisuję "z palca" bezpośrednio w MySQL QueryBrowser
Go to the top of the page
+Quote Post
nevt
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


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.

Ten post edytował nevt 20.02.2008, 13:17:54
Go to the top of the page
+Quote Post
Liberator
post
Post #7





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 10.09.2002
Skąd: Kraków

Ostrzeżenie: (0%)
-----


faktycznie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) baza jest 5.0.27

Znajomy podesłał mi jeszcze inne rozwiązanie, polegające na zmianie domyślnego kodowania bazy (IMG:http://forum.php.pl/style_emoticons/default/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 ęąółćżź (IMG:http://forum.php.pl/style_emoticons/default/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.

Ten post edytował Liberator 20.02.2008, 20:43:10
Go to the top of the page
+Quote Post
nevt
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
Liberator
post
Post #9





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 10.09.2002
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Dziękuję bardzo (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Mam od razu pytanie o EKSPORT do csv (IMG:http://forum.php.pl/style_emoticons/default/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 ||
Go to the top of the page
+Quote Post
nevt
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


  1. SELECT IFNULL(pole1, 'NULL'), IFNULL(pole2, 'NULL') ....
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 18:31