Backup bazy / Kodowanie bazy / Krzaczki zamiast polskich liter
Czasami zdarza się sytuacja, kiedy próbujemy wyświetlić na stronie ciąg znaków pobrany z bazy, jednak zamiast polskich liter widać dziwne krzaczki. Przyczyn tego może być kilka np. skrypt z poziomu PHP nawiązuje połączenie w innym kodowaniu niż zdefiniowane na serwerze MySQL (np. klient: latin1, serwer: utf8).
- W pierwszej kolejności trzeba sprawdzić na jakim kodowaniu pracuje baza:
SHOW VARIABLES LIKE "character_set%";
co powinno zwrócić następujący wynik:
character_set_client utf8 character_set_connection utf8 character_set_database latin2 character_set_filesystem binary character_set_results utf8 character_set_server latin2 character_set_system utf8 character_sets_dir /usr/local/mysql/share/mysql/charsets/
Następnie jeśli trzeba uruchamiamy mysql’a z odpowiednim kodowaniem:
mysql --default-character-set=latin2 - dla iso-8859-2 lub mysql --default-character-set=utf8 - dla UTF8
- Jeśli korzystamy z rozszerzenia mysql, można po funkcji mysql_connect wywołać funkcję mysql_query, podając w niej nazwę odpowiedniego kodowania:
$polaczenie = mysql_connect('host', 'login', 'hasło') or die('Błąd!'); mysql_query("SET NAMES 'latin2'");
Poniżej trochę przydatnych informacji zaczerpniętych z http://www.przemo.org/phpBB2/forum
- Jak prawidłowo wykonać kopię bazy:
- Przy użyciu wbudowanej w forum funkcji backupu (znajdującej się w PA -> SQL -> Kopia zapasowa)
* Gdzie należy opcji szukać – już podałem. Wykonanie backupu sprowadza się do kliknięcia „Wykonaj kopię teraz” (polecam odznaczyć „Kopiuj zawartość tabel search”)
* Plik z backupem został umieszczony w katalogu /db/db_backup/ - Przy użyciu phpMyAdmin (opis w oparciu o phpMyAdmin 2.6.4)
* Zakładam, że każdy ma dostęp do phpMyAdmina (instalacji i konfiguracji tego programu nie mam zamiaru opisywać!)
* Uruchamiamy phpMyAdmina
* W oknie po lewej stronie wybieramy naszą bazę (którą chcemy zabezpieczyć). Dla przykładu konkretnego niech nazywa się ona Guest.
UWAGA: niektórzy administratorzy zabraniają zmiany bazy danych i jest Twoja baza otwierana automatycznie!
* W prawym oknie pojawia się (na samej górze) Eksport
* Zaznaczamy wszystkie tabele
* Wybieramy następujące „Opcje SQL”:- Obejmij eksport transakcją
Dodaj DROP TABLE
Dodaj IF NOT EXISTS
Kompatybilność eksportu SQL: MYSQL40 (najważniejsza opcja!)
Zapisz jako plik
- Przy użyciu wbudowanej w forum funkcji backupu (znajdującej się w PA -> SQL -> Kopia zapasowa)
- Jak prawidłowo odtworzyć kopię bazy
- Przy pomocy phpMyAdmina (kopię wykonaliśmy również z phpMyAdmina i zaznaczyliśmy kompatybilność eksportu MYSQL40 ! )
Dodanie opcji MYSQL40 zapobiega dopisywaniuDEFAULT CHARSET=latin1 AUTO_INCREMENT=1
* Wybieramy w phpMyAdminie naszą bazę.
* Na górze wybieramy SQL (interesuje nas na stronie tylko ramka: „lub Lokalizacja pliku tekstowego”)
* Klikamy „Przeglądaj” i wskazujemy nasz plik z kopią
* Najważniejsze: z rozwijanej listy: „Zestaw znaków dla pliku” wybieramy binary
* Klikamy „Wykonaj”
UWAGA: jeśli otworzy Ci się biała strona, to oznacza iż plik z bazą jest za duży. Co zrobić w takim wypadku opisuje inny temat w FAQ. - Przy pomocy phpMyAdmina (kopię wykonaliśmy również z phpMyAdmina i NIE zaznaczyliśmy kompatybilność eksportu MYSQL40 i/lub w zrobionym zrzucie bazy mamy ciąg „DEFAULT CHARSET…” ! )
* Wchodzimy do phpMyAdmina
* Na pierwszej stronie powinniśmy mieć coś w stylu: „System kodowania znaków dla MySQL: UTF-8 Unicode (utf8)”
Z innymi kodowaniami się nie spotkałem i ich nie będę opisywał. Jednak jeśli takie występuje, to należy najprawdopodobniej to samo wpisać w poleceniach SET poniżej (wyróżnione kolorkiem)
* Edytujemy nasz plik .sql z kopią bazy.
* Na samym początku pliku dopisujemy:SET NAMES ‘utf8‘; SET CHARACTER SET ‘utf8‘; SET SESSION collation_connection = ‘latin1_general_ci‘;
* Zapisujemy plik
* Wybieramy w phpMyAdminie naszą bazę.
* Na górze wybieramy SQL (interesuje nas na stronie tylko ramka: „lub Lokalizacja pliku tekstowego”)
* Klikamy „Przeglądaj” i wskazujemy nasz plik z kopią
* Na rozwijanej liście może zostać dowolna wartość (np: utf8)
* Klikamy „Wykonaj” - Przy pomocy DBLoadera (kopia została wykonana przy użyciu wbudowanej w forum „Kopii zapasowej”)
* Kopiujemy plik z backupem na nowe forum do katalogu głównego forum.
* Wchodzimy do DumpLoadera (http://twojeforum/dbloader/dbloader.php)
* Wybieramy „Wczytaj bazę danych”
* Przed wybraniem pliku (o ile mamy już cokolwiek na forum) proponuję usunąć wszystkie tabele prefix_* (unikniemy w ten sposób błędów, iż nie można utworzyć tabeli, a ponieważ tabele będą już zawierały dane, stąd może dojść do zdublowania informacji). Na wszelki wypadek możesz wykonać aktualną kopię.
* No to zaczynamy: „Rozpocznij wgrywanie”
* Czekamy… i sprawdzamy czy wszystko ok jest z forum (przy tej metodzie nie spotkałem się aby wykonany i wgrany dump nie działał bądź były z nim jakieś problemy z kodowaniem polskich liter)
* UWAGA: w szczególnych przypadkach kopia ta może odtworzyć się z błędami (w efekcie nie będziemy mieli odtworzonych kilku tabel) – sprawdźmy to w zakładce „Sprawdzenie bazy” w dbloaderze. Jeśli tak, wykonaj punkt poniższy wykorzystując do przywrócenia phpMyAdmina. - Przy pomocy phpMyAdmina (kopia została wykonana przy użyciu wbudowanej w forum „Kopii zapasowej”) (opis w oparciu o phpMyAdmin 2.8.x i 2.9.x)
WARUNEK konieczny do prawidłowego odtworzenia polskich znaków: • W starej bazie, w widoku struktury tabel widoczny był napis: „Metoda porównywania napisów” i wartość: „latin1_swedish_ci”
* Wybieramy w phpMyAdminie naszą bazę.
* Na górze w ramce po prawej stronie wybieramy Import (interesuje nas na stronie tylko ramka: „Plik do importu”)
* Klikamy „Przeglądaj” i wskazujemy nasz plik z kopią
* Najważniejsze: z rozwijanej listy: „Zestaw znaków dla pliku” wybieramy ISO-8859-1
* Przypomnę, że nie ruszamy zawartości pozostałych ramek – mają one zostać domyślne
* Klikamy „Wykonaj”
UWAGA: jeśli otworzy Ci się biała strona, to oznacza iż plik z bazą jest za duży. Co zrobić w takim wypadku opisuje inny temat w FAQ.
- Przy pomocy phpMyAdmina (kopię wykonaliśmy również z phpMyAdmina i zaznaczyliśmy kompatybilność eksportu MYSQL40 ! )
Powyższy opis może nie działać, jeśli konfiguracja serwera SQL jest „egzotyczna”. Wówczas takie sytuacje rozwiązuję indywidualnie.
P.S.
Jeśli i to nie pomoże to po połączeniu z bazą danych trzeba zmienić NAMES to powoduje zmianę zarówno danych wychodzących jak i wchodzących do bazy danych:
$sql = “set names cp1250“;
mysql_query($sql);
Witaj. Pomogłeś mi niesamowicie. Zawsze miałem problemy z krzaczkami w bazie po migracji. Od teraz ich już nie będę miał. Dzięki wielkie za pomoc.
Bardzo dobry wpis