Joined: 10 Mar 2006 Posts: 48 Location: Slovenija, Ljubljana
Posted: 24.11.2006 14:02 Post subject: Riješenje - Sortiranje Č,Š,Ž in tako dalje po abecedi
I sam sam muku namučio, ali onda mi je prijatelj uletio sa riješenjem... pa da ne budem škrtica, napisah ga ovdje...
znači imamo znakove Č, Š, Đ, Ž, Ć ...
query:
Code:
$query_zaposleni="SELECT *,replace(replace(replace(replace(replace(naziv_polja,'Č','Cxx'),'Š','Sx'),'Ž','Zx'),'Đ','Dx'),'Ć','Cx') sortiraj FROM naziv_tabele ORDER BY sortiraj ASC";
to je samo za velike tiskane... po potrebi se doda i male tiskane... ako dodaješ novu zamjenu moras na na pocetku, iza "*," dodati i "replace("
nadam se da če ovo nekome uštedjeti vrijeme i živce.
to je uz prijmjeru da su znakovi i u bazi uposani kao "Č" a ne "Č"
u suprotnome se znakove koji moraju bizi zamijenjeni zamijeni sa znakovima koji su u bazi...
Joined: 25 Aug 2003 Posts: 1842 Location: Zagreb, Hrvatska
Posted: 24.11.2006 14:48 Post subject:
Hvala na primjeru!
O kojoj se bazi radi? Koji je charset u igri?
Da li ste mjerili možda što je brže? Pustiti bazu da radi te string replace funkcije, ili ih izvoditi na aplikacijskom nivou?
Sto fali (mysql) rjesenjima:
(latin2 charset u bazi i collation latin2_croatian_ci)
Code:
SELECT whatever, you, need FROM some_table WHERE some_condition = something ORDER BY some_column COLLATE latin2_croatian_ci
(utf8 charset i utf8_slovenian_ci collation)
Code:
SELECT whatever, you, need FROM some_table WHERE some_condition = something ORDER BY some_column COLLATE utf8_slovenian_ci
Naravno, COLLATE dodatak treba samo ako vec collation na tablici nije postavljen ili je postavljen na neki drugi...
Dostupni collation-i u mysql-u su vidljivi upitom:
Code:
SHOW collation;
Također, nije moguće miješati različite charsete sa različitim collationima. utf collationi za utf charset, latin2 ili latin1 collationi za pripadajuci latin charset.
[rant]
Ono što mene itekako muči, na primjer, je činjenica da ne postoji utf8_croatian_ci, i da ako hocu s utf-8 dobiti _apsolutno_ točan ordering na hrvatskom jeziku, moram izvoditi kerefeke na aplikacijskom nivou. Apsolutno točan, u smislu da tretira NJ i LJ slova kao 1 slovo, a ne kao 2, odnosno, Njemačka mora doći poslije Nogometa ako orderamo ascending.
[/rant]
Dakle, ako Vam NJ i LJ nisu problem (a u slovenščini ne bi trebali biti - http://en.wikipedia.org/wiki/Slovenian_alphabet - ne postoje u abecedi kao posebna slova, već samo u izgovoru), utf8 charset u bazi i utf8_slovenian_ci collation je možda jedino što vam treba.
Joined: 10 Mar 2006 Posts: 48 Location: Slovenija, Ljubljana
Posted: 24.11.2006 15:33 Post subject:
zapravo se u mom primjeru radi o situaciji kada imas aplikaciju / stranicu naštimanu na utf-8, a mysql verzija ne podržava collation i character setting... a inace, specificno u mom primjeru je na serveru naštimano na default character setting iso-8859-1... zasto? zbog raznih razloga administratora servera...
nisam mijerio koliko je brzo...
cini mi se da radi dosta brzo, query se izvede trenutacno... a trenutno trazi po 320 vrstica (redova), opet za vecinu primjera je sigurno zadovoljavajuće...
Posted: 09.11.2007 17:36 Post subject: sortanje po hrv. abecedi
eh, to vječno pitanje hr znakova... stpout sam imao problema s tim, stoput sam tražio rješenje po forumima... pa ovo možda nekom pomogne. dakle, (nadam se) ispravno rješenje... ukoliko imate sve okej setupirano na serveru.
napisat ću 2 primjera, ako vam je stranica u utf-8 i ako je u latin2 (odnosno iso-8859-2). na mom serveru za utf8 ne postoji hrvatski collation, već samo slovenski (utf8_slovenian_ci), a za latin2 postoji hrvatski (latin2_croatian_ci).
<body>
<?php
mysql_connect("localhost","MYSQL_USERNAME","MYSQL_PWD") or die(mysql_error());
mysql_select_db("SOME_DB") or die(mysql_error());
// PHP na utf8 - potrebno za mb_strlen i mb_substr !!! (potrebno imati instaliran mb_string u php-u)
mb_internal_encoding("UTF-8");
// SQL na utf8
mysql_query("SET NAMES 'utf8'");
mysql_query("DROP TABLE IF EXISTS probna_utf8");
mysql_query("CREATE TABLE `probna_utf8` (
`ime` mediumtext
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_slovenian_ci") or die(mysql_error());
$test="qwertzuiopšđasdfghjklčćžyxcvbnm";
// obrisi sve
mysql_query("DELETE FROM probna_utf8");
// ubaci u tablicu
for ($i=0; $i<mb_strlen($test); $i++)
mysql_query("INSERT INTO probna_utf8 VALUES('".(mb_substr($test,$i,1))."')");
// povuci
$result=mysql_query("SELECT * FROM probna_utf8 ORDER BY ime");
// ako tablica nema COLLATE=latin2_croatian_ci onda na query treba dodat COLLATE:
// $result=mysql_query("SELECT * FROM probna_utf8 ORDER BY ime COLLATE utf8_slovenian_ci");
primjer kreira tablicu sa samo jednim stupcem, "ime", a kao sadrzaj napuni po jedno slovo iz stringa $test u svaki redak (odnosno, u svaki redak po jedno slovo abecede). nakon toga ispisuje se sadržaj tablice poredan po abecedi. u čemu je (sve) trik?
1. sam php dokument (tekst fajl) mora biti snimljen kao utf-8 (recimo dreamweaver će automatski snimiti kao utf-8 kad se navede utf-8 u meta-charset-u).
2. query SET NAMES 'utf8' govori mysql bazi u kojem se charsetu odvija komunikacija. dakle, ako je sam html (odnosno php) u utf-8... onda utf8, jel?
3. da bi se stvari ispravno sortirale, pri kreiranju tablice dodati: COLLATE=utf8_slovenian_ci ili prilikom select-a COLLATE utf8_slovenian_ci
4. ako se sve radi s utf8, normalne funkcije za rad sa stringovima tipa strlen, substr i slično ne rade dobro, jer je svaki hr znak predstavljen sa 2 byte-a, pa zauzima 2 karakterna mjesta u stringu, zato je potrebno koristiti multibyte verzije (tipa mb_strlen i mb_substr) http://hr.php.net/manual/en/ref.mbstring.php a prije korištenja tih funkcija staviti mb_internal_encoding("UTF-8"); koji govori php-u u kojem su encodingu multibyte stringovi. btw, za te funkcije potrebno je imati instaliran nedefaultni modul "mbstring" u php-u... ja ga imam na jednom serveru a nemam na drugom...
dakle, sve je na utf8, dokument, baza, konekcija.
BITNO: slovenci nemaju slovo Ć, pa je, kao što Ćete vidjeti ako pokrenete primjer, poredak u abecedi a b ć c č d e f g... zašto je meko ć pobogu iza b a ne iza c... pitaj boga. valjda njima nije bilo bitno, pa su ga stavili bilo gdje. iz tog razloga preporučam latin2 odnosno iso-8859-2 za stranice sa hrv znakovima:
// SQL na latin2
mysql_query("SET NAMES 'latin2'");
mysql_query("DROP TABLE IF EXISTS probna_latin2");
mysql_query("CREATE TABLE `probna_latin2` (
`ime` mediumtext
) ENGINE=MyISAM DEFAULT CHARSET=latin2 COLLATE=latin2_croatian_ci") or die(mysql_error());
$test="qwertzuiopšđasdfghjklčćžyxcvbnm";
// obrisi sve
mysql_query("DELETE FROM probna_latin2");
// ubaci u tablicu
for ($i=0; $i<strlen($test); $i++)
mysql_query("INSERT INTO probna_latin2 VALUES('".(substr($test,$i,1))."')");
// povuci
$result=mysql_query("SELECT * FROM probna_latin2 ORDER BY ime");
// ako tablica nema COLLATE=latin2_croatian_ci onda na query treba dodat COLLATE:
// $result=mysql_query("SELECT * FROM probna_latin2 ORDER BY ime COLLATE latin2_croatian_ci");
opet iste napomene kao i za prvi primjer, sve stavit u latin2 odnosno iso-8859-2, samo što nije potrebno koristiti multibyte funkcije (iskreno, nisam siguran zasto, naime postoji mb_internal_encoding("iso-8859-2")?). za razliku od slovenskog collation-a, hr collation ispravno pozicionira Ć.
nadam se da će ovo nekom pomoći, da sam ja našao ovaj post prekjučer... uštedio bi si dva dana, ne? : )
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum