2009-09-17 10 views
8

Zaimportowałem niektóre dane za pomocą LOAD DATA INFILE do bazy danych MySQL. Sama tabela i kolumny używają zestawu znaków UTF8, ale domyślny zestaw znaków bazy danych to łaciński 1. Ponieważ domyślnym typem znaków bazy danych jest łacina1, a ja użyłem LOAD DATA INFILE bez określenia zestawu znaków, zinterpretowano plik jako łaciński1, mimo że dane w pliku to UTF8. Teraz mam kilka źle zakodowanych danych w moim colum UTF8. Znalazłem this article, który wydaje się adresować podobny problem, którym jest "UTF8 wstawiony w cp1251", ale moim problemem jest "Latin1 wstawiony w UTF8". Próbowałem edytować tam kwerendy, aby przekonwertować dane Latin1 na UTF8, ale nie mogę go uruchomić. Albo dane są takie same, albo jeszcze bardziej zniekształcone niż poprzednio. Przykładowo, słowo Québec pokazuje jako "Que".MySQL Konwertuj dane łacińskie1 na UTF8

[DODATKOWE INFO]

Przy wyborze danych zawinięte w HEX(), Quà © bec ma wartość 5175C383C2A9626563.

Stół do utworzenia (skrócony) tej tabeli.

CREATE TABLE MyDBName.`MyTableName` 
(
`ID` INT NOT NULL AUTO_INCREMENT, 
....... 
`City` CHAR(32) NULL, 
....... 
`)) ENGINE InnoDB CHARACTER SET utf8; 
+0

proszę napisać instrukcję CREATE TABLE dla danego stołu, wraz z kilkoma zepsutymi wierszami, ale owinąć zepsutą kolumnę w hex(), tak: 'SELECT HEX (name)) Z miast LIMIT 5'. dzięki tym informacjom pomogę ci znaleźć prawidłowy sposób naprawy zgodnie z tym artykułem. (BTW: uwielbiam ten artykuł, kilka razy uratowałem mój tyłek.) – longneck

Odpowiedz

1

Konwersja łacińskiego1 na UTF8 nie jest tym, co chcesz zrobić, potrzebujesz czegoś wręcz przeciwnego.

Jeśli to, co naprawdę stało się w ten sposób:

  1. UTF-8 ciągi były interpretowane jako Latin-1 i transkodowanie na UTF-8, ich maglowania.
  2. Jesteś teraz, lub może być, czytanie UTF-8 ciągi bez dalszej interpretacji

Co trzeba zrobić, to:

  1. Przeczytaj "UTF-8" bez zmiany kodowania.
  2. Konwertuj na Latin-1. Teraz powinieneś mieć oryginalny UTF-8.
  3. Teraz umieść go w kolumnie "UTF-8" bez dalszej konwersji.
2

LOAD DATA plik_we pozwala ustawić plik kodowanie ma być w:

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

+0

Tak, chciałbym, bym zdał sobie z tego sprawę wcześniej, ale teraz dane są już zmanipulowane. Chciałem wiedzieć, czy mogę to naprawić bez ponownego importowania. – Kibbee

+0

Tak! Jest to opcja: [CHARACTER SET charset_name] –

11

miałem przypadki, jak to w starych instalacjach wordpress z problemem jest, że same dane był już w UTF-8 w bazie danych Latin1 (z powodu domyślnego zestawu znaków WP). Oznacza to, że nie było potrzeby konwersji danych, ale formatów ddbb i table. Z mojego doświadczenia wynika, że ​​rzeczy robią się pomieszane podczas wykonywania zrzutu, ponieważ rozumiem, że MySQL używa domyślnego zestawu znaków klienta, który w wielu przypadkach jest teraz UTF-8. Dlatego upewnij się, że eksportowanie z tym samym kodowaniem danych jest bardzo ważne. W przypadku łacińskich 1 DDBB z kodowaniem UTF-8:

$ mysqldump –default-character-set=latin1 –databases wordpress > m.sql 

Następnie wymień latin1 referencji wewnątrz eksportowanego wysypisko przed ponownego importowania do nowej bazy danych w formacie UTF-8. Sortowanie:

$ replace "CHARSET=latin1" "CHARSET=utf8" \ 
    "SET NAMES latin1" "SET NAMES utf8" <m.sql> m2.sql 

W moim przypadku this link było bardzo pomocne. Skomentował here in spanish.

+0

Widziałem zrzuty MySQL tam, gdzie ta zamiana była niewystarczająca, ponieważ niektóre kolumny były jawnie ustawione na latin1. Zrobiłem 'replace" latin1 "" utf8mb4 " dump.utf8.sql', aby wszystko w tej tabeli używało UTF-8. Zauważ jednak, że "latin1" nie pojawił się nigdzie indziej w zrzucie (zawartość pola) i, po prostu upewnij się, że sprawdziłem diff przed zaimportowaniem go. – basic6

7

Chociaż nie jest to wciąż aktualne dla OP, znalazłem rozwiązanie w dokumentacji MySQL dla ALTER TABLE. I po to właśnie tu w przyszłości:

Warning

CONVERT TO pracy przeliczać kolumn pomiędzy zestawami znaków. Nie jest to, czego potrzebujesz, jeśli masz kolumnę w jednym zestawie znaków (jak łaciński 1), ale zapisane wartości faktycznie używają innego, niekompatybilnego zestawu znaków (jak utf8). W tym przypadku, trzeba wykonać następujące czynności dla każdej takiej kolumny:

ALTER TABLE t1 CHANGE c1 c1 BLOB; 
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8; 

Powodem tego jest to, że działa nie ma konwersji podczas konwersji do lub z kolumny BLOB.

+0

To działało dla mnie. Dzięki! – riverstorm

+0

W przypadku zawartości mieszanej to nie działa: Kod: 1366 SQL State: HY000 --- Niepoprawna wartość ciągu: '\ xE4chste ...' dla kolumny 'kommentar' w rzędzie 1 –

0

Spróbuj tego:

1) Dump Twój DB

mysqldump --default-character-set=latin1 -u username -p databasename < dump.sql 

2) Otwórz dump.sql w edytorze tekstu i zastąpienie wszystkich wystąpień "SET NAZWY latin1" przez "Ustaw nazwy utf8"

3) Utwórz nową bazę danych i przywracania dumpfile

cat dump.sql | mysql -u root -p newdbname 
1

Niedawno ukończyłem skrypt powłoki, który automatyzuje proces konwersji. Można również tworzyć niestandardowe filtry dla dowolnego tekstu, który chcesz zastąpić lub usunąć. Na przykład: usuwanie znaków HTML itp. Możliwe są również białe listy i czarne listy. Możesz pobrać go na sourceforge: https://sourceforge.net/projects/mysqltr/