Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z polskimi znakami
Forum PHP.pl > Forum > Bazy danych > MySQL
Jarod
1. Dodałem za pomocą skryptu php nasepujący string do bazy ęąśżźćłó.

Teraz jeśli za pomocą skryptu php pobiorę dane z bazy, to na ekranie widzę polskie znaki.
Natomiast jak dam selecta z konsoli mysql to zamiast ęąśżźćłó widzę dziwne krzaczki


2. Natomiast jeżeli dodam do bazy striga z polskimi znakami korzystając z konsoli mysql, to po wydaniu selecta
(także z konsoli) na ekranie widzę polskie znaki, natomiast po wyciągnięciu danych za pomocą skyrptu php
nie ma polskich znaków - są jakieś krzaczki.

Próbowałem stosować wskazówki, któe znalazłem na forum php, m.in. tutaj http://forum.php.pl/index.php?showtopic=31...l=polskie+znaki nie pomagają.
oraz na różnych innych stronach z googla. Nie ma poprawy

Muszę mieć możliwość edytowania/dodawania z konsoli a nie tylko z poziomu php.
Konsola mi potrzebna jak ktoś coś namiesza do edycji ręcznej.

Proszę o pomoc. Nie korzystam z phpMyAdmina (nie chcę go i nie istalowałem)
mariuszn3
Wszystko rozbija się o kodowanie znaków. W jakim kodowaniu jest przekazany tekst, który dodajesz, i jakie kodowanie przyjmuje interfejs na którym próbujesz podejrzeć dane.
Pomóż sobie zapytaniem 'SET NAMES'
Jarod
Cytat(mariuszn3 @ 13.06.2006, 11:46 ) *
Wszystko rozbija się o kodowanie znaków. W jakim kodowaniu jest przekazany tekst, który dodajesz, i jakie kodowanie przyjmuje interfejs na którym próbujesz podejrzeć dane.


Cytat(mariuszn3 @ 13.06.2006, 11:46 ) *
Pomóż sobie zapytaniem 'SET NAMES'


SET NAMES latin2 nie pomaga.

Chyba mnie nie rozumiesz. Spróbuje to wyjaśnić dokładniej. Mam bazę i skrypty obsługi (jakiś tam system). Strona jest kodowana charset=iso-8859-2.

Teraz zagwozdka:

Przypadek 1:

Jeśli ze strony, za pomocą formularza dodaje do bazy tekst zawierający polskie znaki to:

- przy odczycie z bazy za pomocą php, na stronie są wyświetlane polskie znaki
- jeśli po takim dodaniu, w konsoli za pomocą zapytania select chcę wyświetlić dodany rekord, to w miejscu polskich znaków mam krzaczki.


Przypadek 2:

Jeśli dodam do bazy tekst zawierający polskie znaki korzystając z konsoli mysqla to:

- jeśli po takim dodaniu, w konsoli za pomocą zapytania select chcę wyświetlić dodany rekord, to w miejscu polskich znaków są polskie znaki - czyli OK.
- przy odczycie z bazy za pomocą php, na stronie są wyświetlane polskie znaki - najczęściej znaki '?'
bendi
Cytat(J4r0d @ 13.06.2006, 14:02 ) *
Przypadek 1:
(...)
- jeśli po takim dodaniu, w konsoli za pomocą zapytania select chcę wyświetlić dodany rekord, to w miejscu polskich znaków mam krzaczki.
(...)
- jeśli po takim dodaniu, w konsoli za pomocą zapytania select chcę wyświetlić dodany rekord, to w miejscu polskich znaków są polskie znaki - czyli OK.
- przy odczycie z bazy za pomocą php, na stronie są wyświetlane polskie znaki - najczęściej znaki '?'

Widzę tutaj 2 elementy wspólne - przy dodawaniu z konsoli Ci się sypie, czyli wg mnie masz kodowanie w konsoli źle ustawione i dlatego się sypie.

Sprawdz czy tabela napewno ma ustawione kodowanie na iso-2, czy strona na której wszystsko wyświetlasz ma iso-2, czy pierwszym zapytaniem, zaraz po połączeniu z mysql'em jest ustawienie kodowanie na iso-2 (SET CHARACTER SET latin2 - chyba), no i ostatnia rzecz (w tym przypadku od tego bym zaczął) sprawdzić kodowanie w konsoli.
Jarod
Cytat(bendi @ 13.06.2006, 13:03 ) *
Sprawdz czy tabela napewno ma ustawione kodowanie na iso-2,

Jak to mogę sprawdzić?

Cytat(bendi @ 13.06.2006, 13:03 ) *
czy strona na której wszystsko wyświetlasz ma iso-2, czy pierwszym zapytaniem, zaraz po połączeniu z mysql'em jest ustawienie kodowanie na iso-2 (SET CHARACTER SET latin2 - chyba)

To się zgadza

Cytat(bendi @ 13.06.2006, 13:03 ) *
, no i ostatnia rzecz (w tym przypadku od tego bym zaczął) sprawdzić kodowanie w konsoli.

Zapytanie w konsoli mysqla:
  1. SHOW VARIABLES LIKE "character_set%";


zwraca:
Cytat
charakter_set_client: latin2
charakter_set_connection: latin2
charakter_set_database: latin1
charakter_set_filesystem: binary
charakter_set_results: latin2
charakter_set_server: latin1
charakter_set_system: utf8
charakter_set_dir: D:\Files\MySQL\MySQL Server 5.0\share\charsets
mariuszn3
Pokolei:

Ważne jest aby MySQL wiedział jakim kodowaniem operuje klient. Jeśli klient sam nie przesyła informacji o kodowaniu, MySQL wtedy przyjmuje kodowanie domyślne czyli latin1 (iso-8859-1) - można to domyślne kodowanie zmienić w pliku konfiguracyjnym.

W Twoim przypadku - jeśli php czy konsola mysql nie przekazuje informacji o kodowaniu, a można przyjąć, że nie przesyłają (bo same z siebie tego nie robią), MySQL przyjmuje, że wszystkie zapytania jakie od nich dostaje są w latin1 i tak samo zachowuje się w drugą stronę (przy zwracaniu danych na zapytanie). To jest trochę zwodnicze, bo mimo danych zapisywanych do bazy w nie właściwym kodowaniu, można odnosić wrażenie, że jest wszystko ok.. ale dopóki własnie nie spróbuje się pobrać danych poprzez interfejs operujący w innym kodowaniu.
Na przykładzie (który najprawdopodobniej odzwierciedla co się dzieje w Twoim przypadku):
Dodawanie danych
  • php przesyła znaki do wprowadzenia do bazy w kodowaniu iso-8859-2
  • Jako, że php nic nie mówi o kodowaniu w jakim pracuje, MySQL przyjmuje je jako znaki w kodowaniu iso-8859-1 i przekazuje je do tablicy.
  • Zakładamy, że tablica ma domyślne kodowanie ustawione na iso-8859-1 (gdyby było inaczej sprawa by była nieco bardziej skomplikowana). Dane w takiej formie jakiej zostały otrzymane są zapisane do tablicy.

Pobieranie danych:
  • php wysyła zapytanie do bazy (pominę już tłumaczenie kodowania samego zapytania, które wygląda tak samo jak wyżej).
  • Baza przyjmując, że php pracuje w kodowaniu iso-8859-1, jak i biorąc pod uwagę to, że kodowanie tabeli to też iso-8859-1 przesyła dane z tabeli bez żadnej konwersji do php
Reasumując - dane z php są bezpośrednio bez żadnej konwersji zapisywane w bazie danych i podobnie są pobierane - czyli nie dziwne, że dodając i czytając dane z bazy tylko poprzez php wszystko wygląda ok.
Teraz załóż (bo tak też zapewne jest), że konsola mysql pracuje w innym kodowaniu (jeśli to na windowsie to zapewne jest to win-1250) i podobnie jak php nie przesyła danych do mysql na temat kodowania w jakim pracuje. Wtedy dzieje się dokładnie to samo co opisałem wyżej i logiczne jest, że konsola pobierając dane zapisane przez php otrzyma szlaczki i wice wersa.

Aby wszystko razem mogło współgrać serwer mysql musi wiedzieć w jakim kodowaniu pracuje klient a to możesz osiągnąć tylko poprzez odpowiednie informowanie serwera mysql (poprzez 'SET NAMES' właśnie).
Najprawdopodobniej w przypadku php przed jakimikolwiek operacjami powinieneś przesłać:
  1. SET NAMES 'latin2'

a w przypadku konsoli mysql na windowsie:
  1. SET NAMES 'cp1250'

Upewnij się, że faktycznie to są te kodowania, bo jeśli jest inaczej to na pewno będzie kaszana.

Dane, które zapisałeś do bazy uprzednio, bez informowania bazy o kodowaniu usuń albo przekonwertuj... bo teraz podchodząc właściwie do sprawy będziesz dostawał w nich krzaczki.
Jarod
Cytat(mariuszn3 @ 13.06.2006, 16:14 ) *
a w przypadku konsoli mysql na windowsie:
  1. SET NAMES 'cp1250'


Wpisałem to na konsoli i w momencie kiedy chcę dodać polskie znaki do tabeli otrzymuję komunikat:
Cytat
#1406 - Data too long for column 'imie' at row 1


worriedsmiley.gif

Ps. Nie przekroczyłem długości pola. Wpisuję jedeną literke - np ś i jest błąd. ormalnie mogę wpisać 15znaków (bez polskich liter)
mariuszn3
Tak jak pisałem, upewnij się, że to faktycznie to kodowanie.
Przejrzałem kodowania obsługiwane przez MySQL i wychodzi, że wiersz poleceń w windowsie XP pracuje w kodowaniu 'DOS Central European'. Czyli polecenie dla konsoli w MySQL będzie wyglądać tak:
  1. SET NAMES 'cp852'
Jarod
Cytat(mariuszn3 @ 13.06.2006, 23:57 ) *
Tak jak pisałem, upewnij się, że to faktycznie to kodowanie.
Przejrzałem kodowania obsługiwane przez MySQL i wychodzi, że wiersz poleceń w windowsie XP pracuje w kodowaniu 'DOS Central European'. Czyli polecenie dla konsoli w MySQL będzie wyglądać tak:
  1. SET NAMES 'cp852'


Jest to samo, czyli:
Cytat
#1406 - Data too long for column 'imie' at row 1


EDIT: W pliku my.cnf zahaszowałem linijke
Cytat
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

i nie wywala błędu i dodaje do bazy.

Ale problem jest nadal. W konsoli mysql po zalogowaniu i wybraniu bazy wpisałem:
  1. SET NAMES 'cp852';


a następnie
  1. INSERT INTO pracownik VALUE (NULL, 2, 'ą', 'ą' , 1, 'TES');


Następnie daje
  1. SELECT * FROM pracownik;


i otrzymuję:
Cytat
2 2 ? ? 1 TES


W phpie tak samo.

-----------------------------
EDIT2: Problem rozwiązany. Odinstalowałem Mysqla 5.x. Zainstalowałem Mysql 4.1.9 i wybrałem tryb konfiguracji zaawansowany. Ustawiłem domyślne kodowanie na latin2. Dalej robię tak jak kazałeś i działa pięknie. Dziękuje bardzo. Dam znać czy z Mysql 5.x też będzie działać.

Pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.