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

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

  1. Jak prawidłowo wykonać kopię bazy:
    1. 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/
    2. 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
  2. Jak prawidłowo odtworzyć kopię bazy
    1. Przy pomocy phpMyAdmina (kopię wykonaliśmy również z phpMyAdmina i zaznaczyliśmy kompatybilność eksportu MYSQL40 ! )
      Dodanie opcji MYSQL40 zapobiega dopisywaniu

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

    2. 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”

    3. 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.
    4. 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.

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);

2 thoughts on “Backup bazy / Kodowanie bazy / Krzaczki zamiast polskich liter

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

Pozostaw odpowiedź HACCP Anuluj pisanie odpowiedzi

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Releated

Jak sprawdzić prędkość serwera www pod hosting?

Szukając wydajnego serwera WWW zastanawiałem się jakie parametry wziąć pod uwagę i jak ocenić jego wydajność? Jak zmierzyć szybkość?  Można by przeprowadzić naprawdę dużo różnych testów, jednakże do większości celów wystarczy sprawdzić kilka podstawowych rzeczy wpływających na szybkość ładowania strony www:  pingi, trasę routingu, szybkość PHP, szybkość MySQL: