października 08
Polskie znaki w MySQL
Często spotykam sie z następującym problemem - po imporcie bazy z jednego serwera na drugi giną polskie znaki diakrytyczne. Najczęściej jest to spowodowane tym, że na starym serwie mamy MySQL o wersji 3.23, 4.0 a na nowym w wersji >4.1. Otóż od tej wersji MySQL, w bazie mamy zaimplementowaną obsługę kodowania znaków, zarówno dla połączeń z bazą, dla samej bazy, dla tabel oraz pojedynczych pól. Postaram się wytłumaczyć jak najlepiej jest przenosić taką bazę i jak z niej korzystać.
Jak już wspomniałem nowe wersje MySQL-a oferują kodowanie. Domyślnym kodowaniem jest latin1_swedish_ci , a więc oczywistym jest, że w tym kodowaniu polskie znaki występować prawidłowo nie będą. Dla nas prawidłowym kodowaniem jest latin2_general_ci lub utf8_general_ci (a właściwie utf8_polish_ci, co opisał na swym blogu matipl.
Jak prawidłowo eksportować bazę?
Na początku ze starej bazy ekportujemy jedynie strukturę.
UWAGA Obrazki, które skierowane są do mniej zaawasowanych, prezentują phpmyadmin na bazie mysql 4.1, więc u Ciebie może to wyglądać trochę inaczej.
1. Wybieramy bazę 
2. Eksportujemy 
3. Odznaczamy dane

Wyświetlony przez przeglądarkę kod kopiujemy do jakiegoś edytora z poprawnym kodowaniem - a więc ISO-8859-2 dla latin2_general_ci oraz UTF8 dla utf8_general_ci (np. Pajaczek, kED, Notepad++) i zapisujemy.
Teraz przystąpimy do edycji zapytań w SQL'u. Otwieramy plik i postępujemy zgodnie ze wskazówkami.
Tworzenie bazy danych - zapisujemy tak :
-
CREATE DATABASE `baza` DEFAULT CHARACTER SET latin2 COLLATE latin2_general_ci;
Uwaga - większość serwerów nie pozwala na tworzenie bazy danych, wiec w phpmyadmin dla istniejącej bazy zmieniamy kodowanie na to wybrane przez nas, a powyższą linijkę usuwamy.
Struktura tabel - kod np. taki:
-
CREATE TABLE `tabela` (
-
`ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
-
`name` VARCHAR(50) NOT NULL DEFAULT '',
-
PRIMARY KEY (`posID`)
-
) TYPE=MyISAM AUTO_INCREMENT=1 ;
poprawiamy na:
-
CREATE TABLE `tabela` (
-
`ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
-
`name` VARCHAR(50) NOT NULL DEFAULT '',
-
PRIMARY KEY (`posID`)
-
) TYPE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=1 ;
Jak widać gołym okiem dodaliśmy tylko DEFAULT CHARSET=latin2. Łatwo to można wyedytować za pomocą funkcji Znajdź/zamień, która jest dostępna w prawie każdym dobrym edytorze (wpisujemy znajdź TYPE=MyISAM i zamień na TYPE=MyISAM DEFAULT CHARSET=latin2 ).
Teraz należy wejść do phpmyadmin na nowym serwerze, kliknąć SQL i wkleić kod. Jeżeli mamy już utworzoną bazę, usuwamy z kodu linijkę tworzącą baze (CREATE DATABASE.. ), klikamy na naszą bazę, przechodzimy do
i wybieramy:

Potem wybieramy SQL i wklejamy zmodyfikowany właśnie kod SQL.
Importujemy dane
Teraz eksportujemy z naszej starej bazy jedynie dane (odznaczamy struktura) i zapisujemy otrzymany kod w pliku za pomocą edytora wspierajacego nasze kodowanie. Pamiętajmy, że jeżeli w pliku będziemy mieli znaki zapytania zamiast polskich znaków to raczej już nic nie będzie się dało z tym plikiem zrobić :/. Można jeszcze próbować opisanego niżej sposobu z Gżegżółką.
Wchodzimy na zakładkę SQL i albo wklejamy zawartość pliku, albo wysyłamy ten plik i importujemy.
Wszystko co było do zrobienia w bazie już zrobiliśmy.
Może istnieć potrzeba, że w kodzie PHP, po każdym połączeniu sie z bazą (mysql_connect) bedziemy musieli wstawić linijkę
Nie działa?
Pamiętaj, że musisz naturalnie ustawić dobre kodowanie plików strony (UTF8 bądź ISO-8859-2) za pomocą edytora oraz poprawny wpis meta
-
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2" />
Defaultowe kodowanie serwera
Może być tak, ze serwer nie wysyła domyślnie naszych dokumentów z kodowaniem jakie byśmy chcieli. Wtedy musimy w każdym dokumencie dodać następującą linijkę:
utf-8 to nasze kodowanie (moze byc ISO-8859-2).
A co jeżeli juz zaimportowałem?
Jeżeli już zaimportowalismy baze to niestety ze znaczkami juz w bazie nic nie zmienimy. Możemy oczywiscie zmieniać każdy znak po kolei, ale kto by się chciał w to bawić.. Musimy mieć plik z wyeksportowaną bazą danych i importować od początku, tak jak to pokazane jest na górze.
Wersja UTF
Coraz popularniejszy jest standard Unicode. Dlatego i tutaj zaprezentuję jak go poprawnie importować.
Róznice są niewielkie, więc podam tylko to co trzeba zrobić inaczej.
Wszędzie zamiast latin2_general_ci wpisujemy utf8_general_ci, a jeszcze lepiej utf8_polish_ci, natomiast zamiast latin2 wpisujemy utf8.
Należy pamiętać, żeby pliki serwisu były również w kodowaniu UTF-8 - pomoże nam w tym Gżegżółka XP.
A jeżeli w wyeksportowanym pliku zamiast polskich znaków mam jakieś krzaczki?
Pomoże nam Gżegżółka XP. Importujemy tam plik i zmieniamy kodowanie - najlepiej ISO 8859-2 lub UTF-8. Ale warto poeksperymentować :]
Często brak tych znaków jest spowodowany tym, że zapisujemy plik jakimś marnym edytorem. Porządne programy jak Pajączek, Eclipse czy kED nie powinny miec problemu. Po prostu kopiujemy kod z eksportu do tego programu i zapisujemy.
Na koniec
Przenoszenie bazy danych często sprawia problemy, dlatego powstał ten poradnik. Jest to mój pierwszy tekst tutaj i mam nadzieje, że Wam pomógł. Proszę o wszelkie uwagi i oceny.



