Konwertowanie kodowania latin1 do UTF-8 w MySQL

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