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:
- Baza danych mysql musi być wgrana w odpowiednim kodowaniu (tabele, pola muszą mieć także ustawione odpowiednie kodowanie)
- Skrypt php musi odebrać dane w odpowiednim kodowaniu i je odpowiednio wysyłać
- 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)
- 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.
- 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:
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 ąęćś
tosiek - 07-10-2008, 18:29
bankesta1, wgraj w końcu sobie swojego phpmyadmina a nie używasz shitowego yoyowego
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.... 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...
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
|
|
|