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