To jest tylko wersja do druku, aby zobaczyć pełną wersję tematu, kliknij TUTAJ
phpBB2 by Przemo
Support forów phpBB2 modified by Przemo

Bazy danych SQL - Naprawianie bazy danych - krzaków na forum

tosiek - 30-09-2008, 15:20
Temat postu: Naprawianie bazy danych - krzaków na forum
Naprawianie bazy danych - przywracanie polskich znaków na forum
W tym temacie jest opisany sposób jak naprawić kodowanie bazy danych tak aby w starych potach wyświetlały się poprawnie polskie znaki oraz w nowych także by działały.

Cała naprawa polega na tym aby w kopii naszej bazy danych były widoczne polskie znaki i aby tą kopię zapisać w kodowaniu UTF-8 oraz DELIKATNIE JĄ PRZEROBIĆ. Następnie należy przystosować forum, i potem wgrać taką kopię bazy.

Trochę informacji - przydatne podstawy
phpBB by Przemo pracuje w kodowaniu ISO-8859-2, to kodowanie ma także inną nazwę: latin2. Jest to jedno i to samo! (nazwa latin2 jest wykorzystywana w bazach mysql)

Ten temat prezentuje metodę przerobienia jakiejkolwiek bazy, w jakimkolwiek kodowaniu na kodowanie latin2, w którym działają polskie znaki i które obsługuje phpBB by Przemo. Będziemy tutaj operować na kopiach bazy danych.

Aby móc naprawić działanie polskich znaków potrzebujesz kopii bazy danych w której są zamiast polskich znaków krzaki (dowolne!) lub po prostu kopię w której są POLSKIE ZNAKI.

Krzaki to znaki które się wyświetlają zamiast znaków których oczekujemy (zamiast prawidłowych).

Aby polskie znaki działały muszą być spełnione 3 warunki:

  1. Baza danych mysql musi być wgrana w odpowiednim kodowaniu (tabele, pola muszą mieć także ustawione odpowiednie kodowanie)
  2. Skrypt php musi odebrać dane w odpowiednim kodowaniu i je odpowiednio wysyłać
  3. Kodowanie zdefiniowane na stronie musi się zgadzać z kodowaniem bazy danych

O spełnienie pierwszych dwóch warunków musimy zadbać sami, bo nikt wcześniej nie pomyślał żeby o to zadbać.

Jeśli w samej bazie danych (w widoku w phpmyadminie) lub kopi bazy danych zamiast polskich znaków są ? (znaki zapytania) to niestety ale tego już nie da się naprawić, pozostaje ręczna naprawa z pomocą jakiegoś słownika.

Potrzebne narzędzia
  • Edytor obsługujący trzy kodowania: ISO 8859-2, utf-8,ANSI
    polecam Edit Plus 3 ( cały tutorial będzie oparty na tym edytorze ) lub przykładowy darmowy Notepad2 - http://www.flos-freeware.ch/notepad2.html
  • Dobry backup bazy, czyli np. w phpmyadminie wykonany w opisany niżej sposób
  • Chwila wolnego czasu i trochę cierpliwości


Jak zrobić poprawny backup w phpmyadminie ?
Należy w zakładce Eksport zaznaczyć oraz wybrać:
  • Obejmij eksport transakcją
  • Tryb zgodności SQL z listy wybrać MYSQL40 WAŻNE !
  • Dodaj DROP TABLE / VIEW / PROCEDURE / FUNCTION
  • Dodaj IF NOT EXISTS
  • Dodaj wartości AUTO_INCREMENT
  • Użyj cudzysłowów z nazwami tabel i pól
  • Dodaj CREATE PROCEDURE / FUNCTION



Przystosowanie skryptu forum oraz bazy dla kodowania latin2

Ustawienie kodowania dla bazy danych
Należy wejść do okienka zapytań SQL (w phpmyadminie lub w panelu administratora na forum) i wykonać zapytanie:
Kod:
ALTER DATABASE `nazwa_bazy` DEFAULT CHARACTER SET latin2 COLLATE latin2_general_ci;

Gdzie za nazwa_bazy wstawiamy nazwę bazy która wyświetla się po lewej stronie ( baza z forum ). Od tej pory wszystkie tabele wgrywane do tej bazy przyjmą kodowanie latin2 (nie jest to w 100% gwarantowane o tym niżej).

Ustawienie kodowania dla skryptu forum
Otóż musimy ustawić odpowiednie kodowanie dla połączeń z bazą, które wykonuje nasze forum. Możemy ręcznie edytować pliki, lub możesz ściągnąć plik kodowanie_latin2.zip z załącznika i wgrać pliki mysql4.php oraz mysql.php do katalogu /db/ w folderze z twoim forum.

Jeśli chcesz ręcznie edytować pliki to otwórz plik: /db/mysql4.php i znajdź:
Kod:
$dbselect = mysql_select_db($this->dbname);

Dodaj pod:
Kod:
mysql_query('SET NAMES latin2 COLLATE latin2_general_ci', $this->db_connect_id);

Zapisz plik i wyślij na serwer zamieniając za stary.

Otwórz plik: /db/mysql.php i znajdź:
Kod:
$dbselect = @mysql_select_db($this->dbname);

Dodaj pod:
Kod:
mysql_query('SET NAMES latin2 COLLATE latin2_general_ci', $this->db_connect_id);

Zapisz plik i wyślij na serwer zamieniając za stary.

Od tej pory nasz skrypt forum i baza mają ustawione odpowiednie kodowanie, teraz wystarczy wgrać odpowiednio backup naszej bazy do tej bazy lub najpierw trochę naprawić ten backup a potem wgrać.

Naprawianie oraz rozpoznanie kodowania backupu naszej bazy
Otóż całość naprawy sprowadzać się będzie do tego momentu aż zobaczymy w edytorze polskie znaki, następnie gdy już je widzimy należy zapisać plik z bazą w kodowaniu utf-8, ponieważ jest to najwygodniejsze z dostępnych kodowań - nawet notatnik w windows je obsługuje ;) Potem przy wgrywaniu takiego backupu do bazy ustawionej na latin2 (pamiętajmy nasz backup jest zakodowany w utf8 po zapisie) należy pamiętać o delikatnej edycji backupu - ostatni podpunkt w tym dziale, to zapewni nam iż baza danych wgra się w poprawnym kodowaniu, oraz tabele i pola będą miały ustawione odpowiednie kodowanie.

Przed ponownym otwarciem pliku z bazą w innym kodowaniu zamknij cały edytor tekstu EditPlus3 i włącz go od nowa!


    • Otwieranie pliku z kopią bazy w odpowiednich kodowaniach
    • Zaczniemy od przystosowania edytora Edit Plus 3 do obsługi kodowań, podobnie trzeba postępować przy innych edytorach. Odpalamy program i wchodzimy w zakładkę File >> Open ( skrót klawiaturowy CTRL + O ) i szukamy na dole przycisku z ... ( trzema kropkami ) i klikamy na niego, wyskoczy nam lista kodowań na której szukamy Central European (iso-8859-2) oraz Central European (Windows) 1250, zaznaczamy je i klikamy strzałeczkę aby przeciągnąć je na lewą stronę i potwierdzamy przyciskiem OK



    • Rozpoznanie kodowania pliku z kopią bazy
    • Teraz możemy otworzyć plik z kopią bazy ( oczywiście po uprzednim wypakowaniu z archiwum jeśli została wybrana kompresja przy eksporcie ) znowu klikamy File >> Open lecz teraz zanim potwierdzimy chęć otwarcia pliku z listy Encoding: będziemy wybierać kodowanie najpierw utf-8 i klikamy Otwórz

      Po czym sprawdzamy czy w otwartej bazie są wszystkie Polskie znaki wiec szukamy za pomocą wyszukiwarki która można otworzyć z zakładki Search >> Find lub skrótem CTRL + F, następnie zaznaczamy opcje Case sensitive i wyszukujemy polskie znaki z ogonkami np. Ź, Ż, Ł, ź, ł, ą wpisując je (każdy pojedynczo) w polu Find what: i klikamy Find
      Jeśli znajdują się wszystkie oznacza to że możesz zapisać plik z bazą w kodowaniu UTF-8 i przejdź do kroku Delikatna przeróbka bazy

    • Jeśli nie znalazłeś polskich znaków to otwórz plik zgodnie z instrukcja wcześniej lecz przy otwieraniu wybierz kodowanie Encoding: Central European ( iso-8859-2 )

      Oznacza to że twoja kopia jest zakodowana w kodowaniu ISO-8859-2, zapisz tę kopię w kodowaniu UTF-8 i przejdź do delikatnej przeróbki.

    • Jeśli nadal nie widzisz polskich znaków lub tylko niektóre przy otwieraniu wybierz kodowanie: Central European (Windows) 1250 i sprawdź czy teraz widać wszystkie polskie znaki. Jeśli tak to zapisz kopię bazy w kodowaniu UTF-8 i przejdź do delikatnej przeróbki bazy.

    • Jeśli zupełnie nie możesz znaleźć polskich znaków w którymkolwiek kodowaniu przejdź do kroków niżej


    • Przy otwieraniu bazy w różnych kodowaniach nie widzę, nie mogę znaleźć polskich znaków
      Jeżeli nadal nie masz polskich znaków oznacza to że musisz teraz trochę edytować kopię bazy
      Najpierw otwieramy plik z kodowaniem Encoding: UTF-8


      Zaczynamy od wyszukania tabeli phpbb_posts_text (lub tabeli o innym prefixie, jeśli mamy inny niż phpbb_) i zjeżdżając niżej szukamy wyrazy z polskimi znakami które będą widoczne jako krzaki np.
      ¼ -> ź,
      ± -> ą,
      ¶ ->ś

      Jeśli w miejscach gdzie powinny być polskie znaki widać ? - znaki zapytania, to takiej kopi nie da się naprawić!
      Jeśli tak jakby ucina miejsca gdzie powinny być polskie znaki i zamiast np. śmigło widać migo to otwórz tę bazę w innym kodowaniu niż utf-8 (cofnij się do kroków rozpoznawania kodowania)

      Jeśli rozpoznałeś te krzaki możesz ściągnąć z załącznika plik: krzaki_z_latin1.zip i otworzyć plik Krzaki z latin1.txt np. za pomocą notatnika lub innego edytora (otwórz z kodowaniem UTF-8). Teraz musisz każdy krzaczek zamienić na odpowiadający mu polski znak, zgodnie z listą podaną w tym pliku. (jeśli twoje krzaki nie zgadzają się z tymi w pliku, możesz samemu zamieniać kopiując krzaki które znalazłeś na polskie znaki zamiast których występują).

      Zamiast ręcznej edycji możesz skorzystać z automatycznego konwertera, który nie naprawia tylko polskich znaków lecz wszystkie znaki, które występują w tym kodowaniu! dostępny jest pod adresem http://tosiek.pl/converter/ należy wybrać konwersję z ISO-8859-1 ( latin1 ) natomiast docelowe na UTF-8. Jeśli;i chcesz ręcznie naprawić postępuj zgodnie z poniższą instrukcją.

      Skorzystamy z funkcji Search >> Replace... (skrót CTRL+H), otworzy nam się okno w którym zaznaczamy tylko dwie opcje:
      *Case sensitive
      *Wrap at the end of file
      Resztę odznaczamy.

      W polu Find what: wpisujemy krzaczek, który chcemy zamienić na polski znak, np pierwszy z listy: ±
      W polu Replace with: wpisujemy polski znak jaki odpowiada temu krzaczkowi zgodnie z lista w pliku jest to: ą
      Następnie klikamy na: Replace all, postępujemy tak z każdym krzackziem z listy (z każdym polskim znakiem)

      Pamiętaj o wielkości liter!



      Po naprawie bazy przechodzimy do zapisu tej bazy jako UTF-8 i następnie do delikatnej edycji bazy!

      Przykład krzaków najbardziej powszechnych przed naprawą:

      oraz te same krzaki po naprawie na poprawne polskie znaki: (naprawa przeprowadzona zgodnie z tabelka krzaków w załączniku)



  1. Zapisywanie kopi bazy w kodowaniu UTF-8
    Jeśli otworzyliśmy kopię naszej bazy danych w taki sposób iż widać w niej wszystkie polskie znaki lub ją odpowiednio naprawiliśmy, to możemy ją zapisać w kodowaniu UTF-8. Robimy to poprzez zakładkę File >> Save As... i z listy Encoding: wybierz UTF-8

    Od tej pory twój plik z bazą jest kodowany w utf-8, żeby zobaczyć polskie znaki musisz go otworzyć w takim kodowaniu i przy wgrywaniu takiej kopi do bazy mysql także należy wgrać ją jako utf8 (np z listy w phpmyadminie należy wybrać kodowanie utf8), następnie należy przejść do delikatnej przeróbki bazy.

  2. Delikatna przeróbka bazy - bardzo istotny krok
    Jeśli widząc polskie znaki zapisałeś swoja kopię bazy jako UTF-8 to otwórz swoją kopię bazy od nowa w kodowaniu UTF-8. I teraz jest zupełna dowolność, ponieważ wszelkie kopie baz danych różnią się od siebie...

    Zaczynamy od wyszukania frazy SET NAMES (przypominam zakładka Search >> Find ) jeśli ją znajdziemy to sprawdzamy jakie kodowanie jest obok niej wpisane, jeśli inne niż utf8 to zmieniamy na:
    Kod:
    SET NAMES utf8


    Jeśli nie mamy takiej frazy to na samym początku pliku z kopią bazy danych dodajemy linijkę:
    SET NAMES utf8;

    Następnie szukamy frazy: CREATE TABLE i gdzieś w okolicach tej frazy rozglądamy się za ustawionym kodowaniem dla pól i porównaniem (coś podobnego do tego: CHARSET=latin1 COLLATE=latin1_swedish_ci; )

    Kodowanie to pojedyncza nazwa np. utf8, latin1, latin2
    Porównanie składa się z 3 członów: 1 człon to nazwa kodowania, 2 to rodzaj? porównania, trzeci to fraza ci i tak odpowiednio dla kodowań wyżej: utf8_unicode_ci, latin1_swedish_ci, latin2_general_ci

    Otóż jeśli znajdziemy jakieś porównanie to kopiujemy jego nazwę i zamieniamy na latin2_general_ci, pokaże na przykładzie latin1_swedish_ci (zmieniamy za pomocą Search >> Replace...) i klikamy Replace all:


    Kolejny krok po zmianie porównania to zmienienie kodowania na latin2, jeśli porównaniem było latin1_swedish_ci to kodowaniem będzie latin1 (warto jeszcze się rozejrzeć po innych tabelach czy nie występuje inne). Ważne jest aby najpierw zmienić porównanie a jako drugie kodowanie! i znów zmieniamy tym razem z latin1 na latin2 i klikamy Replace All:


    Po tych zmianach możemy zapisać znów naszą kopię bazy jako utf8 i możemy teraz dopiero przejść do wgrywania!






Wgrywanie pliku bazy zapisanego w kodowaniu utf8
Po naprawieniu kodowaniu pliku bazy i przystosowania bazy oraz forum można wgrać kopię bazy, pamiętając o wybraniu kodowania z listy takiego w jakim zapisaliśmy plik z bazą, czyli w naszym wypadku utf8 (dla tych co robili backup za pomocą skryptu forum i wykryli że ich kopia jest kodowana w iso-8859-2 wybierają latin2, chyba że przerobili ten backup na utf-8)

W phpmyadminie w zakładce import z listy Zestaw znaków dla pliku: wybieramy utf8
a z listy Tryb zgodności SQL wybieramy MYSQL40 i klikamy wykonaj i baza się wgra z poprawnymi polskimi znakami



Potem wyczyść cache forum ( robi się to przez Panel Administracyjny >> Indeks Administracji i na dole jest przycisk Wyczyść cache lub przez klienta FTP czyścimy katalog /cache/ zostawiając jedynie plik .htaccess )

Przenoszenie bazy danych z serwera na serwer
Na nowej bazie należy wykonać zapytanie
Kod:
ALTER DATABASE `nazwa_bazy` DEFAULT CHARACTER SET latin2 COLLATE latin2_general_ci;

Gdzie za nazwa_bazy wstawiamy nazwę bazy która wyświetla się po lewej stronie ( baza z forum )
A następnie wgrać do tej bazy nasz backup wybierając odpowiednie kodowanie z listy. Należy pamiętać także o zmodyfikowanych plikach mysql4.php oraz mysql.php.

Jeśli backup był robiony za pomocą phpmyadmina wybieramy z listy kodowanie: utf8 natomiast jeśli za pomocą skryptu forum to wybieramy: latin2

bankesta1 - 05-10-2008, 12:13

Tosiek, wszystko pięknie ładnie... ale jednak coś mi nie działa... :? mianowicie :) robie to:
Cytat:
Zaczniemy od przystosowania edytora Edit Plus 3. Odpalamy program i wchodzimy w zakładkę File >> Open ( skrót klawiaturowy CTRL + O ) i szukamy na dole przycisku z ... ( trzema kropkami ) i klikamy na niego, wyskoczy nam lista kodowań na której szukamy Central European (iso-8859-2), zaznaczamy je i klikamy strzałeczkę aby przeciągnąć je na lewą stronę i potwierdzamy przyciskiem OK
dalej to:
Cytat:
Teraz możemy otworzyć plik z kopią bazy ( oczywiście po uprzednim wypakowaniu z archiwum jeśli została wybrana kompresja przy eksporcie ) znowu klikamy File >> Open lecz teraz zanim potwierdzimy chęć otwarcia pliku z listy Encoding: będziemy wybierać kodowanie najpierw utf-8 i klikamy Otwórz
Potem, sprawdzam bazę , mam ąęćś itp. mam to w gdy robię podgląd w editplus , ale jest problem gdy zapisze plik, wtedy już nie ma ąęść ... :/ i wogóle jak zapisać plik w rozszerzeniu `sql w editplus ???
tosiek - 05-10-2008, 12:24

bankesta1 napisał/a:
ale jest problem gdy zapisze plik, wtedy już nie ma ąęść ...

Bo po zapisie masz zakodowaną bazę w latin2, więc przy otwieraniu musisz wybrać kodowanie Central European is-8859-2 aby zobaczyć polskie znaki

bankesta1 napisał/a:
wogóle jak zapisać plik w rozszerzeniu `sql w editplus ???

Save As.. >> Zapisz jako typ...: All Files >> i w nazwie wpisujesz np. baza.sql

bankesta1 - 05-10-2008, 12:42

hmm, wyskakują mi błędy przy wgrywaniu bazy(co normalnie się nie zdarza)
Cytat:
Warning: mb_strpos() [function.mb-strpos]: Unknown encoding or conversion error. in /var/www/mysql1.yoyo.pl/libraries/string.lib.php on line 112

Warning: mb_strpos() [function.mb-strpos]: Unknown encoding or conversion error. in /var/www/mysql1.yoyo.pl/libraries/string.lib.php on line 112

Warning: mb_strpos() [function.mb-strpos]: Unknown encoding or conversion error. in /var/www/mysql1.yoyo.pl/libraries/string.lib.php on line 112

jak wgrywam starą bazę - tam gdzie nie ma ąę to baza ładnie się wgrywa... a znowu ta druga po modernizacji ma błędy......
ps. w IMPORCIE, zestaw znaków dla pliku ma być utf8 ??

tosiek - 05-10-2008, 12:45

bankesta1 napisał/a:
IMPORCIE, zestaw znaków dla pliku ma być utf8 ??

tosiek napisał/a:
Wgrywanie pliku bazy zapisanego w kodowaniu latin2
W phpmyadminie w zakładce import z listy Zestaw znaków dla pliku: wybieramy latin2
a z listy Tryb zgodności SQL wybieramy MYSQL40 i klikamy wykonaj i baza się wgra z poprawnymi polskimi znakami

bankesta1 - 05-10-2008, 13:22

ciekawa sprawa, bo robię słowo w słowo jak to opisałeś a baza cały czas wgrywa mi się z błędami... nie wiem jak to wytłumaczyć .... :|
tosiek - 05-10-2008, 14:23

bankesta1, a jesteś pewien że backup został zrobiony ze zgodnością mysql40 oraz wykonałeś zapytanie:
Kod:
ALTER DATABASE `nazwa_bazy` DEFAULT CHARACTER SET latin2 COLLATE latin2_general_ci;

??

I wgraj sobie tego phpmyamdina i z niego korzystaj: http://www.przemo.org/php...pic.php?t=62088

bankesta1 - 06-10-2008, 19:57

tosiek napisał/a:
a jesteś pewien że backup został zrobiony ze zgodnością mysql40
tak
tosiek napisał/a:
oraz wykonałeś zapytanie:
Kod:
ALTER DATABASE `nazwa_bazy` DEFAULT CHARACTER SET latin2 COLLATE latin2_general_ci;
, tak ale wywala błąd:
Kod:
Błąd

zapytanie SQL:

ALTER DATABASE `nazwa_bazy` DEFAULT CHARACTER SET latin2 COLLATE latin2_general_ci

MySQL zwrócił komunikat: Dokumentacja
#1044 - Access denied for user 'praca'@'localhost' to database 'nazwa_bazy'

hmm w starej bazie metoda porównywania napisów to: latin2_general_ci , więc może dlatego jest błąd.

xlesiu - 06-10-2008, 20:12

bankesta1 napisał/a:
Kod:
Błąd

zapytanie SQL:

ALTER DATABASE `nazwa_bazy` DEFAULT CHARACTER SET latin2 COLLATE latin2_general_ci

MySQL zwrócił komunikat: Dokumentacja
#1044 - Access denied for user 'praca'@'localhost' to database 'nazwa_bazy'
Ale zamiast nazwa bazy miałeś wpisać swoją nazwę bazy.
bankesta1 - 07-10-2008, 18:25

xlesiu, nazwa bazy jest OK :) ale co z tego skoro cały czas wywala mi błąd....
Cytat:
Warning: mb_strpos() [function.mb-strpos]: Unknown encoding or conversion error. in /var/www/mysql1.yoyo.pl/libraries/string.lib.php on line 112

Warning: mb_strpos() [function.mb-strpos]: Unknown encoding or conversion error. in /var/www/mysql1.yoyo.pl/libraries/string.lib.php on line 112

Warning: mb_strpos() [function.mb-strpos]: Unknown encoding or conversion error. in /var/www/mysql1.yoyo.pl/libraries/string.lib.php on line 112

Nie wiem co jest grane.... nie wiem jak okiełznać te ogonki ąęćś :roll:

tosiek - 07-10-2008, 18:29

bankesta1, wgraj w końcu sobie swojego phpmyadmina a nie używasz shitowego yoyowego :twisted:
http://www.przemo.org/php...pic.php?t=62088

bankesta1 - 08-10-2008, 17:05

tosiek napisał/a:
a nie używasz shitowego yoyowego
, to , że to yoyo nie znaczy to ,.że ten phpmyadmin jest do bani.... :twisted: jest dobry taki jak każdy inny, natomiast ten co wgrałem wywala same komendy na czerwono:
Kod:
Błąd
#2002 - Serwer nie odpowiada (lub gniazdo lokalnego serwera MySQL nie jest skonfigurowane poprawnie)
Cytat:
Nieznany język: pl-iso-8859-2.
Nie znaleziono domyślnego motywu graficznego omega!
no i rzecz jasna nie idzie się zalogować.... dziwne... :twisted:
tosiek - 08-10-2008, 17:09

bankesta1 napisał/a:
Nieznany język: pl-iso-8859-2.

bankesta1 napisał/a:
Unknown encoding or conversion error

Yoyo nie obsługuje latin2 na to wygląda, napisz do nich :)

kamilko - 24-10-2008, 21:35

Dziwne ale zrobiłem wszystko co napisałes i mam dalej ? ? ? ? ? ? ? a w bazie były te ¼ -> ź pozamieniałem zapisałem wysłałem i lipa ;/
tosiek - 25-10-2008, 06:23

kamilko napisał/a:
zrobiłem wszystko co napisałes

Robić to robiłeś tyle ile przeczytałeś... Przeczytaj całe i pamiętaj że musisz zapisać w odpowiednim kodowaniu ! I potem przy wysyłaniu odpowiednie wybrać ( latin2)
I pamiętaj o zmianie pliku mysql4.php ( aktualnie screeny nie działają )

[ Dodano: 25-10-2008, 07:30 ]
pamiętaj też że musisz każdy polski znak diakrytyczny zmienić:
http://pl.wikipedia.org/wiki/Znaki_diakrytyczne



Powered by phpBB modified by Przemo © 2003 phpBB Group