bns techlog

MySQL, latin1 i krzaki zamiast polskich znaków

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.

Categories: Wpis

Edycja menu Gnome, LXDE, XFCE, Cinnamon albo Unity » « Otwieranie plików PDF w oknie przeglądarki Firefox

2 Comments

  1. 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

    • Czemu statystyk nie będzie?
      Statystkę zapewnia potok fgrep + wc :) (5 linia)

      Do zmiany znaków użyłem sed (6 linia), mogłem awk bądź podany przez Ciebie tr:

      cat $1 | tr  ${latin1[$i]}' '${utf8[$i]}'

      Po składni widać, że bardziej optymalne jest użycie sed gdyż jest edytorem strumieniowym a do tr strumień podaje cat :)

Dodaj komentarz

Your email address will not be published.

*

Powiadom mnie mailowo o nowych komentarzach. Możesz również zapisać się bez zostawiania komentarza.

Copyright © 2017 bns techlog

Theme by Anders NorenUp ↑