Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> NAMES / CHARACTER SET
zietek
post
Post #1





Grupa: Zarejestrowani
Postów: 34
Pomógł: 1
Dołączył: 25.12.2007

Ostrzeżenie: (0%)
-----


Witam, przesiadam sie z MS SQL na MySQL i dopadaja mnie male problemy...
Kodowanie tabel mam ustawione na 'utf-8'. Nie wiem czemu zapytania SELECT zwracaja dopiero poprawnie dane (do PHP) po zastosowaniu wczesniej:
  1. SET NAMES 'utf-8'

Do czego sluzy zatem NAMES (skoro mam zdefiniowane kodowanie w tabelach) ?
Czy mozna ten parametr ustawic globalnie dla calej bazy aby nie ustawiac go przed kazdym SELECT ? (uwaga: NIE chodzi mi tu o caly serwer bazy)

Drugie pytanie jakis sie nasuwa: jakie roznice w dzialaniu maja dwa ponizsze zapisy ?
  1. SET NAMES 'charset_name'
  2. SET CHARACTER SET charset_name


I jeszcze jeden maly problem z sortowaniem w utf-8.
Zauwazylem ze:
  1. SELECT * FROM tabela ORDER BY pole

w przypadku gdy wyrazy zaczynaja sie np na 's' oraz 'ś' nie sortuje ich w kolejnosci 1) s; 2) ś a uznaje jako s-s i dopiero sortowanie odbywa sie po kolejnej literze...
Da sie temu zaradzic?

Zauwazylem w Query Managar'ze, ze to zapytan typu SELECT dodawane sa czesto na koncu pojedyncze znaki np:
  1. SELECT * FROM tabela ORDER BY pole o

Jaki skutek to odnosi w MySQL?
Go to the top of the page
+Quote Post
sticker
post
Post #2





Grupa: Zarejestrowani
Postów: 611
Pomógł: 19
Dołączył: 28.02.2005
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


jakie masz collation na bazie i na tabeli?


--------------------
Go to the top of the page
+Quote Post
Indeo
post
Post #3





Grupa: Zarejestrowani
Postów: 295
Pomógł: 7
Dołączył: 26.03.2004
Skąd: Opole

Ostrzeżenie: (0%)
-----


Baza może mieć różne kodowania i może w nich poprawnie przechowywać narodowe znaki (o ile ich nie pożera - zamiana na ?). Nie jest oczywiste, że baza danych z kodowaniem A zwraca wyniki w kodowaniu A. Baza może zwracać dane w B (dowolnym kodowaniu) ale musisz ją poinformować o tym inaczej będzie zwracać w domyślnym kodowaniu dla połączeń z bazą danych (lub czasem cholera wie wg czego). Dlatego set names B nawet na bazie z kodowaniem A zwróci wynik w kodowaniu B. Dlatego też w set names żąda się kodowania którego używa się na stronie. Skoro na stronie używasz kodowania utf8 to warto po połączeniu z bazą dać set names utf8, żeby zwracane wyniki były zgodne z kodowaniem strony.
Za odpowiednie traktowanie polskich znaków odpowiada collation . Pola które posiadają polskie znaki powinny mieć polskie collation w ramach danego charset czyli utf8_polish_ci dla utf.


--------------------
Go to the top of the page
+Quote Post
zietek
post
Post #4





Grupa: Zarejestrowani
Postów: 34
Pomógł: 1
Dołączył: 25.12.2007

Ostrzeżenie: (0%)
-----


Dzieki za wyczepujaca odpowiedz:) Zapytam jeszcze czy przy operacjach INSERT, UPDATE tez nalezy przy uzyciu SET NAMES ustawic kodowanie jakie mamy na stronie (kodowanie w jakim wedruja dane do bazy).
Go to the top of the page
+Quote Post
Indeo
post
Post #5





Grupa: Zarejestrowani
Postów: 295
Pomógł: 7
Dołączył: 26.03.2004
Skąd: Opole

Ostrzeżenie: (0%)
-----


Dokładnie tak! Znowu - kodowanie które trafia do bazy może być inne niż w bazie (byleby w jakiś sposób potrafiła zapisać polskie znaki) trzeba tylko poinformować bazę czego ma się spodziewać w potoku danych - do tego służy set names. Baza przekonwertuje kodowanie na swoje własne tylko musi wiedzieć z jakim ma do czynienia na wejściu. Sama tego nie odgadnie. Nie zawsze domyślne ustawienia są bezkonfliktowe dlatego warto używać set names. W szczególności kiedy importujesz plik sql w określonym kodowaniu - musisz uprzedzić bazę o tym kodowaniu.


--------------------
Go to the top of the page
+Quote Post
prond
post
Post #6





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Jeszcze mała wskazówka do sortowania - jeżeli masz np. tabelę, w której trzymasz dane w wielu językach będziesz czasem chciał je przesortować stosując inne metody porównywania napisów. Musisz to niestety robić jawnie w każdym zapytaniu:
  1. SELECT * FROM `pages` ORDER BY name collate utf8_polish_ci;

lub
  1. SELECT * FROM `pages` ORDER BY name collate utf8_czech_ci;


Niestety coś takiego nie wpływa na metodę porównywania napisów przy sortowaniu:
  1. SET NAMES 'charset_name' COLLATE 'collation_name';


Generalnie najwygodniejszy jest utf8, z domyślnie ustawioną metodą porównywania napisów na tę, której będziesz stosował najczęściej,


--------------------
--------------------------------------------------------------------------------
weblog.axent.pl
--------------------------------------------------------------------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 11:58