Ostatnio dostałem takiego potworka jak bazę postawioną na MySQL kodowaną w latin1 (ISO 8859-1, zachodnioeuropejskie) inaczej mówiąc krzaki w bazie zamiast polskich liter :)
Działać to jakoś działa. Schody zaczynają się gdy trzeba przenieść to na nowy serwer bazodanowy gdzie wymogiem jest kodowanie w utf-8 :)
Problem jest w kodowaniu polskich znaków. Mapowanie ma złe pokrycie z naszymi znakami stąd występują inne symbole zamiast znanych nam liter z ogonkami.
Remedium
Eksport bazy do latin1_swedish_ci. Metoda wedle uznania (mysqldump, phpMyAdmin)
mysqldump -uroot -p -R --single transaction BAZA > dump.sql
Konwertujemy formatowania pliku bazy do UTF-8
iconv -f ISO8859-1 -t UTF-8 dump.sql > dump_utf8.sql
Teraz najważniejsze – zamieniamy krzaki na polskie litery.
Poniższy kod mojego skryptu zapisujemy do pliku latin2utf.sh
. Nadajemy mu prawa do wykonywania chmod +x latin2utf.sh
.
Skrypt uruchamiamy podając jako parametr plik ze zrzutem bazy ./latin2utf.sh dump.sql
#!/bin/bash latin1=("±" "æ" "ê" "³" "ñ" "ó" "¶" "¼" "¿" "¡" "Æ" "Ê" "£" "Ñ" "Ó" "¦" "¬" "¯") utf8=("ą" "ć" "ę" "ł" "ń" "ó" "ś" "ź" "ż" "Ą" "Ć" "Ę" "Ł" "Ń" "Ó" "Ś" "Ź" "Ż") for (( i=0; i < ${#latin1[@]}; i++ )); do ile=`fgrep -o ${latin1[$i]} $1 | wc -l` sed -i 's/'${latin1[$i]}'/'${utf8[$i]}'/g' $1 echo "${latin1[$i]} > ${utf8[$i]} ($ile)" done ile=`fgrep -o 'DEFAULT CHARSET=latin1' $1 | wc -l` sed -i 's/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/g' $1 echo "latin1 > UTF8 ($ile)"
Przykładowe wyjście na konsoli po wykonaniu skryptu:
$ ./latin2utf.sh dump.sql ± > ą (3018) æ > ć (898) ê > ę (2671) ³ > ł (4372) ñ > ń (916) ó > ó (574) ¶ > ś (1791) ¼ > ź (102) ¿ > ż (2275) ¡ > Ą (6) Æ > Ć (27) Ê > Ę (9) £ > Ł (126) Ñ > Ń (25) Ó > Ó (1) ¦ > Ś (138) ¬ > Ź (18) ¯ > Ż (42) latin1 > UTF8 (46)
Na koniec zmieniony plik ze dumpem importujemy do bazy która mamy w UTF-8.
28 sierpnia 2012 — 9:44
A tak z ciekawości się zapytam: sprawdzałeś polecenie tr? Na pierwszy rzut oka wygląda mi na to, że lepiej sobie z takim zadaniem poradzi i na pewno prościej.
Oczywiście, statystyk wtedy żadnych nie będzie ;)
Pozdrawiam,
Łukasz
28 sierpnia 2012 — 10:02
Czemu statystyk nie będzie?
Statystkę zapewnia potok
fgrep
+wc
:) (5 linia)Do zmiany znaków użyłem
sed
(6 linia), mogłemawk
bądź podany przez Ciebietr
:Po składni widać, że bardziej optymalne jest użycie
sed
gdyż jest edytorem strumieniowym a dotr
strumień podajecat
:)