2010-03-30 12 views
28

Konwertuję stronę internetową z ISO na UTF-8, więc potrzebuję również konwertować bazę danych MySQL.Konwersja bazy danych MySQL z łaciny na UTF-8

W Internecie czytam różne rozwiązania, nie wiem, który wybrać.

Czy naprawdę trzeba konwertować moje kolumny varchar do binarny, a następnie na UTF-8 tak:

ALTER TABLE t MODIFY col BINARY(150); 
ALTER TABLE t MODIFY col CHAR(150) CHARACTER SET utf8; 

To zajmuje dużo czasu, aby to zrobić dla każdej kolumny, z każdej tabeli, z każdej bazy danych .

Mam 10 baz danych, z 20 tabelami każda, z około 2 - 3 kolumnami varchar (2 zapytania każda kolumna), to daje mi około 1000 zapytań do napisania! Jak to zrobić?

Rozwiązane: mogę napisać kod, który użyłem:

PASSWORD="" 
db=$1 

mysqldump --password=$PASSWORD --set-charset --skip-set-charset --add-drop-table --databases "$db" > /home/dev/backup/bdd.sql 

QUERY="ALTER DATABASE \`$db\` DEFAULT CHARACTER SET utf8;" 
mysql --password=$PASSWORD --database "$db" -e "$QUERY" 

mysql --password=$PASSWORD --default-character-set=utf8 < /home/dev/backup/bdd.sql 

zobaczyć odpowiedź poniżej, aby uzyskać więcej informacji.

+2

nie są '--set-charset' i' --skip-set-charset' bezpośrednio konkurujących flagi? Dokumenty mówią, że wpływają na użycie 'SET NAMES', ale nie ustawiają parametru' DEFAULT CHARSET = X', który jest wyprowadzany przez 'mysqldump' na tabelę. (mysql 5.5) – fideloper

Odpowiedz

19

Możesz to zrobić bardzo łatwo za pomocą zrzutu. Zrób zrzut korzystając

mysqldump --skip-opt --set-charset --skip-set-charset 

Następnie należy utworzyć innej bazy danych, ustawić domyślny zestaw znaków na UTF-8, a następnie załadować zrzut z powrotem:

mysql --default-character-set=<your iso encoding> 

Główną ideą jest, aby zrzut bez znak kodowania danych.
Tak więc, w czasie tworzenia kodowanie tabeli będzie dziedziczone z kodowania bazy danych i ustawione na UTF-8. I z --default-character-set mówimy MySQL, aby automatycznie przekodować nasze dane.

+0

To wydaje się fajne! Dlaczego nie ma tego w dokumentacji, albo nigdzie o tym nie rozmawiamy, dzięki temu przetestuję to, –

+0

@Matthieu, ponieważ wydaje się, że zrobisz to za pomocą '--all-databases', zrób to ostrożnie. Wykonaj kopię zapasową i przetestuj cały algorytm w jednej bazie danych. –

+0

Po prostu przetestowałem (tylko na jednej bazie danych), a to nie zmienia kodowania kolumn (są one nadal w "łacińskim"). Dla pewności, dla mysqldump, 3 parametry nie potrzebują wartości? –

6

Używam mysqldump Ver 10.11 Distrib 5.0.77

Z jakiegoś powodu create opcje silnika i auto_increment został pominięty. Spowodowało to wiele błędów wstawiania, ponieważ auto_increment zniknął w polach klucza podstawowego.

To zadziałało dla mnie. Używam --opt i za pomocą sed, aby usunąć zestaw znaków z pliku sql.

mysqldump -p --opt --skip-set-charset --add-drop-table dbname > /tmp/dbname.sql 
sed -i 's/DEFAULT CHARSET=latin1//g' /tmp/dbname.sql 
ALTER DATABASE dbname DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_danish_ci; 
mysql -p --default-character-set=utf8 db < /tmp/dbname.sql 
+1

Ponieważ Mysql 5.5 wyświetli 'DEFAULT CHARSET = latin1', którego' --default-character-set = utf8' nie zostanie nadpisany przy imporcie, krok ten staje się konieczny. Użyłem 'sed -i 's/DEFAULT CHARSET = latin1/DEFAULT CHARSET = utf8/g'/tmp/dbname.sql', aby jawnie ustawić go na utf8. – fideloper

1
mysqldump --opt --skip-set-charset --default-character-set='latin1' -u root -p revive_adserver --result-file='dump.sql' 

vim dump.sql 

:%s/latin1/utf8/gi 

:wq 

mysql -u root -p 

ALTER DATABASE revive_adserver CHARACTER SET utf8; 

\q 

mysql -D revive_adserver -u root -p < dump.sql