Forum FAQForum FAQSearchSearch MemberlistMemberlist Forum ignore listForum ignore list RegisterRegister ProfileProfile Log in to check your private messagesLog in to check your private messages Log inLog in
Riješenje - Sortiranje Č,Š,Ž in tako dalje po abecedi

 
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    mi3dot.org Forum Index -> Server-side
View previous topic :: View next topic  
Author Message
Mihael



Joined: 10 Mar 2006
Posts: 48
Location: Slovenija, Ljubljana

PostPosted: 24.11.2006 14:02    Post subject: Riješenje - Sortiranje Č,Š,Ž in tako dalje po abecedi Add user to your forum ignore list Reply with quote

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...

pozdrav iz Janezlandije!
Back to top
View user's profile Send private message Visit poster's website
zytzagoo
mi3.crew


Joined: 25 Aug 2003
Posts: 1842
Location: Zagreb, Hrvatska

PostPosted: 24.11.2006 14:48    Post subject: Add user to your forum ignore list Reply with quote

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.

_________________
[+]I[+]am[+]my[+]own[+]religion[+]
Back to top
View user's profile Send private message Visit poster's website Twitter profile
Mihael



Joined: 10 Mar 2006
Posts: 48
Location: Slovenija, Ljubljana

PostPosted: 24.11.2006 15:33    Post subject: Add user to your forum ignore list Reply with quote

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...
Back to top
View user's profile Send private message Visit poster's website
Sulien



Joined: 04 Jan 2004
Posts: 2905
Location: Zagreb

PostPosted: 24.11.2006 16:15    Post subject: Add user to your forum ignore list Reply with quote

LOL Very Happy nice hack

osobno nikad toliko patio na sortiranje, general_ci mi je ok i preživim što CČĆ nije u pravilnom redoslijedu - glavno da nije na kraju

dobra fora za slovenian_ci
Back to top
View user's profile Send private message Send e-mail Visit poster's website
Mihael



Joined: 10 Mar 2006
Posts: 48
Location: Slovenija, Ljubljana

PostPosted: 24.11.2006 17:18    Post subject: Add user to your forum ignore list Reply with quote

zapravo ja ne koristim utf8-slovenian-ci več imam definiran samo utf8... radi to i na meki Ć i Đ...
Back to top
View user's profile Send private message Visit poster's website
videodrome



Joined: 21 Mar 2006
Posts: 3
Location: Zagreb

PostPosted: 09.11.2007 17:36    Post subject: sortanje po hrv. abecedi Add user to your forum ignore list Reply with quote

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).

prvo primjer za UTF-8:

Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>test hr(slo) collation utf8</title>
</head>

<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");

   // prikazi
   printMySQLresultSet($result);
   
   function printMySQLresultSet($rs)
   {
      echo "<table>";
      $num_results=mysql_num_rows($rs);
      while(--$num_results>=0)
         echo "<tr><td>".implode("</td><td>",mysql_fetch_row($rs))."</td></tr>";
      echo "</table>";
   }
?>
</body>
</html>


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:

Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
<title>test hr collation latin2</title>
</head>

<body>
<form action="collation_test_latin2.php" method="post" >
<input name="tekst" type="text" />
<input name="" type="submit" />
</form>
<?php
   mysql_connect("localhost","MYSQL_USERNAME","MYSQL_PWD") or die(mysql_error());
   mysql_select_db("SOME_DB") or die(mysql_error());

   // 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");

   // prikazi
   printMySQLresultSet($result);
   
   function printMySQLresultSet($rs)
   {
      echo "<table>";
      $num_results=mysql_num_rows($rs);
      while(--$num_results>=0)
         echo "<tr><td>".implode("</td><td>",mysql_fetch_row($rs))."</td></tr>";
      echo "</table>";
   }
?>
</body>
</html>


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? : )

_________________
videodrome | web design | multimedia
http://www.videodrome.hr
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    mi3dot.org Forum Index -> Server-side All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2005 phpBB Group