Zarejestruj się na BitBay.net
Home > MySQL, PHP > Backup bazy / Kodowanie bazy / Krzaczki zamiast polskich liter

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);
Kategorie:MySQL, PHP Tagi:, ,
  1. Ahmed
    Październik 4th, 2010 at 22:17 | #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.

  2. Luty 10th, 2015 at 00:42 | #2

    Bardzo dobry wpis

  1. Brak jeszcze trackbacków
*