Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: mysql order by utf-8 polskie znaki
Forum PHP.pl > Forum > Bazy danych > MySQL
AxZx
witam

chce sortowac kolumny z nazwami wojewodztwa wg jego nazwy
dlaczego łódzkie jest na koncu? za zachodniopomorskim?

kodowanie tabeli utf-8

wersja mysql:
4.1.21-log

zapytanie:
  1. CREATE TABLE `wojewodztwa` (
  2. `woj_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `woj_nazwa` varchar(45) character SET utf8 collate utf8_unicode_ci NOT NULL,
  4. PRIMARY KEY (`woj_id`),
  5. UNIQUE KEY `unikalna` (`woj_nazwa`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
SongoQ
Klient MySQLa musi pracowac w utf-8.

  1. SET character_set_client = utf8


Jak nie pomoze to dorzuc
  1. SET character_set_results = utf8
  2. SET character_set_connection = utf8
AxZx
przed kazdym moim zapytaniem daje

  1. <?php
  2. mysql_query('SET NAMES 'utf8'');
  3. mysql_query('SET character_set_client 'utf8'');
  4. mysql_query('SET character_set_results 'utf8'');
  5. mysql_query('SET character_set_connection 'utf8'');
  6. ?>


rezultat taki sam jak wczesniej
SongoQ
Na pewno poprawne kodowanie masz w bazie?
AxZx
tak mi sie wydaje

takie zapytanie napisalem do stworzenia tabeli w ktorej chce sortowac

  1. CREATE TABLE `wojewodztwa` (
  2. `woj_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `woj_nazwa` varchar(45) character SET utf8 collate utf8_unicode_ci NOT NULL,
  4. PRIMARY KEY (`woj_id`),
  5. UNIQUE KEY `unikalna` (`woj_nazwa`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
wolan
zamiast utf8_unicode_ci ustaw utf8_polish_ci...
AxZx
a co w przypadku gdy chce tez korzystac z cyrylicy?
wtedy sortowanie bedzie poprawne w tym i w trym jezyku?winksmiley.jpg
marcin110987
Cytat(AxZx @ 5.09.2006, 18:02:19 ) *
witam

chce sortowac kolumny z nazwami wojewodztwa wg jego nazwy
dlaczego łódzkie jest na koncu? za zachodniopomorskim?

kodowanie tabeli utf-8

wersja mysql:
4.1.21-log

zapytanie:
  1. CREATE TABLE `wojewodztwa` (
  2. `woj_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `woj_nazwa` varchar(45) character SET utf8 collate utf8_unicode_ci NOT NULL,
  4. PRIMARY KEY (`woj_id`),
  5. UNIQUE KEY `unikalna` (`woj_nazwa`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


Wysilę się dla potomych, bo sam jakiś czas szukałem rozwiązania lepszego niż zmiana kodowania kolumny w tabeli z utf8_general_ci na utf_polish_ci.

Jeśli robisz zapytanie w postaci:
  1. SELECT * FROM `wojewodztwa` WHERE 1 ORDER BY `nazwa`
to wynik dostaniesz w kodowaniu takim jak masz zakodowaną kolumnę `nazwa`. Czyli w utf8_general_ci polskie znaki będziesz miał inaczej niż się przyjęło w polskim alfabecie. Np. 'Ł' za 'Z', czy 'Ż' i 'Z' w tym samym miejscu.


Z pomocą przychodzi COLLATE dla zapytania:
  1. SELECT * FROM `wojewodztwa` WHERE 1 ORDER BY `nazwa` COLLATE utf8_polish_ci
teraz nie ważne jest jak masz zakodowane dane w bazie, bo i tak wynik będzie w utf_polish_ci, a resztę możesz mieć cyrylicą i doklejać do siebie wyniki w różnych alfabetach.

Jeśli chcesz czytać z php wyniki, to nie zapomnij o ustawieniu zaraz za połączeniem z bazą "set names utf8", bo dostaniesz krzaki.
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.