Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql] ...ORDER BY miasto
Forum PHP.pl > Forum > Bazy danych
em1X
Mam tabele z roznymi danymi a m.in. nazwami miast ktore chce rozmieszczac alfabetycznie. Niestety niektore z miast zaczynaja sie polskimi znakami jak Świnoujscie. Gdy wykonuje zapytanie: select * from tabela order by miasto asc zwraca mi od a-z miasta jednak nie tak jak chcialem... przyklad:

Białystok, Lublin, Warszawa, Łódź ; powinno byc Białystok, Lublin, Łódź, Warszawa...

ktos ma pomysl jak zrobic aby rozroznialo polskie znaki?
Seth
Mozna by np.: zamienic pierwsza litere na jej odpowiednik w alfabecie ang. np.: ł na l itd. A wlasciwa litere przesunac na koniec
przyklad:
Łódź -> LódźŁ
Potem przy wypisywaniu danych zamienić pierwszy znak na ostatni. 8)

Wiem, ze to rozwiazanie ma kilka wad , ale chyba moze sie przydac :wink:
kryr
A moze tak:
ł na -l
ą na -a
ż na -z
ź na --z
itd...
a potem (przy wyciaganiu z bazy) zamieniac z powrotem?
Seth
nieeeee... bedzie zalatwo biggrin.gif
Seth
Cytat
A moze tak:
ł na -l
ą na -a
ż na -z
ź na --z
itd...
a potem (przy wyciaganiu z bazy) zamieniac z powrotem?

Nie sadze, zeby to bylo dobre rozwiazanie. Przy sortowaniu beda zle wyniki.
kryr
:idea: To to moze tak: :wink:
zdublowac pole znazwa, jedna zeby byla bez polskich liter (lodz) a druga z... a sortowac wedlog tego pola bez polskich znakow :?:
kurtz
Cytat
Białystok, Lublin, Warszawa, Łódź ; powinno byc Białystok, Lublin, Łódź, Warszawa...

ktos ma pomysl jak zrobic aby rozroznialo polskie znaki?

ustaw odpowiedni jezyk w bazie - use default encoging czy charset o ile mnie pamiec nie myli
em1X
kurtz jako jedyny napisal cos sensownego tongue.gif dzieki
msulik
W międzyczasie wpadłem na rozwiązanie "skryptowe", w razie, gdyby ktoś nie mógł zmienić konfiguracji.
Kod
<?php

$convtab_from_pl = array('ą'=>'a/', 'ć'=>'c/', 'ę'=>'e/', 'ł'=>'l/', 'ń'=>'n/', 'ó'=>'o/', 'ś'=>'s/', 'ź'=>'x/', 'ż'=>'z/', 'Ą'=>'A/', 'Ć'=>'C/', 'Ę'=>'E/', 'Ł'=>'L/', 'Ń'=>'N/', 'Ó'=>'O/', 'Ś'=>'S/', 'Ź'=>'X/', 'Ż'=>'Z/'); // byc moze trzeba bedzie zamienić 'ż' na 'ź' i 'Ż' na 'Ź'

$convtab_to_pl = array ();

foreach ($convtab_from_pl as $k => $v)

{

$convtab_to_pl[$v] = $k;

}



function code_from_pl ($arg)

{

global $convtab_from_pl;

$arg = preg_replace ('/([acelnosACELNOS])/','1 ',preg_replace ('/Z/','X ',preg_replace ('/z/','x ',$arg)));

$arg = strtr($arg,$convtab_from_pl);

return $arg;

}



function code_to_pl ($arg)

{

global $convtab_to_pl;

$arg = preg_replace ('/([acelnosACELNOS])s/','1',preg_replace ('/Xs/','Z',preg_replace ('/xs/','z',$arg)));

$arg = strtr($arg,$convtab_to_pl);

return $arg;

}



$tekst = array('Łódź', 'Zażółć gęślą jaźń', 'Górsk', 'Łódzki Pcim', 'Lubicz', 'Goszcz', 'Zakopane', 'Grzeszne Myśli'); // przykładowa tablica danych.

$n = count($tekst);

echo ('Nie posortowane:<br>');

for ($i = 0; $i < $n; $i++)

{

echo ('<b>'.$i.':</b> '.$tekst[$i].'<br>');

}



$temp = $tekst;

echo('<br>Posortowane "na prymitywa" (według zasady "<b>z</b>" &lt; "<b>ć</b>"...):<br>');

sort ($temp);

for ($i = 0; $i < $n; $i++)

{

echo ('<b>'.$i.':</b> '.$temp[$i].'<br>');

}



echo('<br>Zakodowane:<br>');



// gwóźdź programu - tak zakodowane dane wstawiamy do bazy. w bazie sortujemy najzwyklej w świecie: ORDER BY.



for ($i = 0; $i < $n; $i++)

{

$tekst[$i] = code_from_pl ($tekst[$i]);

echo ('<b>'.$i.':</b> '.$tekst[$i].'<br>');

}



sort ($tekst); // "symulacja";) ORDER BY



echo ('<br>Posortowane poprawnie:<br>');

for ($i = 0; $i < $n; $i++)

{

echo ('<b>'.$i.':</b> '.(code_to_pl($tekst[$i])).'<br>');

}

?>


W ostatniej chwili zauważyłem, że jest jakiś problem w kodowaniu polskich znaków na forum, więc zamieszczam to samo pod adresem http://strony.wp.pl/wp/msulik/php.pl/116/sort.php.html
Sergio
witam.

jak wprowadzic w zycie podpowiedz kuritza questionmark.gif
GeoS
Cytat
witam.

jak wprowadzic w zycie podpowiedz kuritza questionmark.gif


W winshitie masz plik my.cnf i wpisujesz sobie cos takiego:
Kod
default-character-set=latin1


PS Dane tez musisz miec zapisane z tym kodowaniem, bo inaczej cala zmiana kodowania nic nie da.
dragossani
Znajdź u siebie plik my.cnf (u mnie jest w /etc/ ale u Ciebie niekoniecznie) i znajdź sekcję [mysqld]. Musi się tam znaleźć następujący zapis:
Cytat
default-character-set = latin2
language = polish

Z moich doświadczeń wynika, że pomaga na wszelkie problemy z językiem w MySql, z sortowaniem włącznie.
Tylko nie zapomnij zmusić serwer do odświeżenia konfiguracji. :wink:
dragossani
Hhh... laugh.gif sorki, nie przerzuciłem strony i nie zauważyłem, że gajcy2 już odpowiedział.
[quote]P: To ten.
K: Jak to, too teen? Chcesz powiedzieć, że ten obiekt znajduje się w zasięgu mojego wzroku? Pokaż go to palcem bo chciałbym uwierzyć, że śnię.
P: No to...
K: To?! Co to jest?!
P: No jak to co? Las...
K: Możesz mi powiedzieć... Po chuj mi las?
P: Jak to po chuj? W scenopisie pisze, że las. Jest napisane.
K: W scenopisie?! Znjadź mi to w scenopisie!
P: Proszę. Kiedy wyjechali na wyniosłość drogi, oczom ich ukazał się las.
K: Przewróć stronę.
P: O kurwa...
K: Czytaj.
P: Oczom ich ukazał się las... Krzyży.[/quote]
Hyper, tylko nie wywalaj do Hydeparku, tak mi się skojarzyło :wink:
I sorki za wyrażenia ale bez nich to by nie było to samo.

A tak na marginesie Gajcy2, na pewno latin1? U mnie ustawiłem latin2 i wszystko jest ok. Muszę to sprawdzić...[/quote]
Sergio
ja ustawilem na czech poniewaz wedlug mnie jest najbardziej zblizony do polskiego :-)
ftrunks
Cytat
ja ustawilem na czech poniewaz wedlug mnie jest najbardziej zblizony do polskiego :-)

bardziej od polskiego 8)
scanner
Cytat
I znajdź sekcję [mysqld]. Musi się tam znaleźć następujący zapis:
Cytat
default-character-set = latin2
language = polish
Co może być przyczyną, że podczas uruchamiania demona otrzymuję taki błąd:
Cytat
030526 10:13:16 mysqld started
No variable match for: -O 'default-character-set = latin2'
/usr/local/mysql/bin/mysqld Ver 3.23.56 for pc-linux on i686
Use '--help' or '--no-defaults --help' for a list of available options
030526 10:13:16 mysqld ended
kurtz
Cytat
Co może być przyczyną, że podczas uruchamiania demona otrzymuję taki błąd:
Cytat
030526 10:13:16 mysqld started
No variable match for: -O 'default-character-set = latin2'
/usr/local/mysql/bin/mysqld Ver 3.23.56 for pc-linux on i686
Use '--help' or '--no-defaults --help' for a list of available options
030526 10:13:16 mysqld ended

http://www.mysql.com/doc/en/Character_sets.html twierdzi ze prawidlowa sekcja jest [client] a nie mysqld!

na poczatek sprobuj tego ;)

ps
jesli dobrze koajrze mowiles ze masz slacka - sprawdz czy masz confa w /usr/share/mysql/charsets

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.