Konwertowanie kodowania latin1 do UTF-8 w MySQL

Czasem bywa problem z kodowaniem gdy przenosimy baze zapomocą mysqldump.
Poniżej szybki opis z przykładami jak rozwiazać problem gdy baza pierworna jest w latin1 a chcemy miec utf-8.
W poniższym przykładzie serwer mysql to localhost, user root i haslo password. Wszystko wykonywane jest w bash-u
Najpierw zrzucamy bazę do pliku.
mysqldump -uroot -ppassword --default-character-set=latin1 -c --insert-ignore --skip-set-charset -r nazwa_pliku_dumpa.sql nazwa_bazy_danych
Teraz można sprawdzić kodowanie pliku.
file nazwa_pliku_dumpa.sql
Jeżeli plik jest w UTF8 otrzymamy odpowiedz jak poniżej:
file nazwa_pliku_dumpa.sql: UTF-8 Unicode text, with very long lines
Jeżeli zachowało się kodowanie latin1 musimy przekonwertować plik:
iconv -f ISO8859-1 -t UTF-8 nazwa_pliku_dumpa.sql > nazwa_pliku_dumpa-utf-8.sql
W dumpie bedzie jeszcze info zawarte o latin1, zmienimy to szybko perlem
perl -pi -w -e 's/CHARSET=latin1/CHARSET=utf8/g;' nazwa_pliku_dumpa-utf-8.sql
Teraz już pozostaje nam tylko import bazy danych. Jednak warto przekonfigurawać serwer i klienta mysql aby poprawnie wszystko było w utf-8.
Edytujemy plik /etc/mysql/my.cnf i w odpowiednich sekcjach dodajemy:
[client]
(...)
default-character-set = utf8
(...)
[mysqld]
(...)
collation_server = utf8_general_ci
character_set_server = utf8
(...)
[mysqldump]
(...)
default-character-set = utf8
(...)
[mysql]
(...)
default-character-set = utf8
(...)
W wyniku tego po wejściu do mysql i wywołaniu
show variables like 'char%';
powinniśmy widzieć:
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
Teraz juz pozostaje nam tylko utworzenie nowej bazy danych oraz import pliku.
mysql -uroot -ppassword --execute="DROP DATABASE nazwa_bazy_danych; CREATE DATABASE nazwa_bazy_danych CHARACTER SET utf8 COLLATE utf8_general_ci;"
mysql -uroot -ppassword --default-character-set=utf8 nazwa_bazy_danych < nazwa_pliku_dumpa-utf-8.sql
I to wszystko :). Mam nadzieje że komuś sie przyda