Sortiranje po azbuci (azbuka i mysql)

S

Као земља са два равноправна писма нисмо баш „стандардни“ разним произвођачима програмских пакета са пуном подршком за наш, Српски, језик. Поред „смећа у бази“, врло чест проблем везан за карактер сетове у MySQL-у и Српски језик је

  • Сортирање – проблем са сортирањем је прилично смарајући пошто ако имамо садржај писан и латиницом и ћирилицом и пробамо да га сортирамо, прво ће бити сортиран латинични текст по абецеди а затим ће бити ћирилични текст по азбуци, смор, знам
  • Поређење – проблем са поређењем је још већи, ако имамо садржај који меша ћирилицу и латиницу (на пример форум где су неки постови латинични а неки ћирилични) претрага тог садржаја ће враћати половичне резултате пошто „иницијализација“ и „inicijalizacija“ неће бити препознати као иста реч. Многи то решеавају тако што бране да садржај буде на више писама те конвертују сваки текст у једно писмо (најчешће у латиницу пошто је конверзија из ћирилице у латиницу једнозначна и једноставна док обрнуто не бажи).

MySQL а и остали РДБМС који имају потпуну подршку за карактер сетове подржава колације. Колација је сет правила који дефинише како се неки карактер сет понаша у одређеном језику. Ту се дефинише:

  • тежина сваког карактера (сортирање)
  • једначење карактера (сортирање, поређење)
  • контракције (њ==nj na primer)
  • експанзије (MySQL их тренутно не подржава)

MySQL долази уз брдо колација за utf8mb4 карактер сет али ниједна од тих колација не ради посао за Српски језик. На срећу, MySQL дозвољава кориснику да дода своју колацију без рекомпајлирања самог сервера. Екстерне колације се налазе у character_sets_dir директоријуму.

Да би сте додали Српску колацију у MySQL потребно је да у Index.xml фајл у character_sets_dir директоријуму

mysql> show variables like 'character_sets_dir';
+--------------------+-----------------------------------------------------------+
| Variable_name      | Value                                                     |
+--------------------+-----------------------------------------------------------+
| character_sets_dir | /usr/local/mysql-5.5.5-m3-linux2.6-x86_64/share/charsets/ |
+--------------------+-----------------------------------------------------------+

у секцији utf8mb4 додате нову колацију, дакле испод:

<charset name="utf8">
  <family>Unicode</family>
  <description>UTF-8 Unicode</description>
  <alias>utf-8</alias>
  <collation name="utf8_general_ci"	id="33">
   <flag>primary</flag>
   <flag>compiled</flag>
  </collation>
  <collation name="utf8_bin"		id="83">
    <flag>binary</flag>
    <flag>compiled</flag>
  </collation>
</charset>

додате:

 <collation name="utf8_serbian_ci" id="1200">
  <rules>
    <reset>\u0410</reset> 
      <i>A</i> 
      <i>a</i> 
    <reset>\u0411</reset> 
      <i>B</i> 
      <i>b</i> 
    <reset>\u0412</reset> 
      <i>V</i> 
      <i>v</i> 
    <reset>\u0413</reset> 
      <i>G</i> 
      <i>g</i> 
    <reset>\u0414</reset> 
      <i>D</i> 
      <i>d</i> 
    <reset>\u0402</reset> 
      <i>\u0110</i>
      <i>\u0111</i> 
      <i>\u0189</i> 
      <i>Dj</i>
      <i>DJ</i>
      <i>dj</i>
    <reset>\u0415</reset> 
      <i>E</i> 
      <i>e</i> 
    <reset>\u0416</reset> 
      <i>\u017D</i> 
      <i>\u017E</i> 
    <reset>\u0417</reset> 
      <i>Z</i> 
      <i>z</i> 
    <reset>\u0418</reset> 
      <i>\u0419</i> 
      <i>\u0439</i> 
      <i>I</i> 
      <i>i</i> 
    <reset>\u0408</reset> 
      <i>J</i> 
      <i>j</i> 
    <reset>\u041A</reset> 
      <i>K</i> 
      <i>k</i> 
    <reset>\u041B</reset> 
      <i>L</i> 
      <i>l</i> 
    <reset>\u0409</reset> 
      <i>\u01C7</i> 
      <i>\u01C8</i> 
      <i>\u01C9</i> 
      <i>Lj</i>
      <i>LJ</i>
      <i>lj</i>
    <reset>\u041C</reset> 
      <i>M</i> 
      <i>m</i> 
    <reset>\u041D</reset> 
      <i>N</i> 
      <i>n</i>
    <reset>\u040A</reset> 
      <i>\u01CA</i>
      <i>\u01CB</i> 
      <i>\u01CC</i>
      <i>Nj</i>
      <i>NJ</i>
      <i>nj</i>
    <reset>\u041E</reset> 
      <i>O</i> 
      <i>o</i> 
    <reset>\u041F</reset> 
      <i>P</i> 
      <i>p</i> 
    <reset>\u0420</reset> 
      <i>R</i> 
      <i>r</i> 
    <reset>\u0421</reset> 
      <i>S</i> 
      <i>s</i> 
    <reset>\u0422</reset>
      <i>T</i> 
      <i>t</i> 
    <reset>\u040B</reset> 
      <i>\u0106</i> 
      <i>\u0107</i> 
    <reset>\u0423</reset>
      <i>U</i>
      <i>u</i> 
    <reset>\u0424</reset> 
      <i>F</i> 
      <i>f</i> 
    <reset>\u0425</reset> 
      <i>H</i>
      <i>h</i> 
    <reset>\u0426</reset> 
      <i>C</i> 
      <i>c</i> 
    <reset>\u0427</reset> 
      <i>\u010C</i> 
      <i>\u010D</i> 
    <reset>\u040F</reset>
      <i>\u045F</i> 
      <i>\u01C4</i> 
      <i>\u01C5</i>
      <i>\u01C6</i> 
      <i>Dz</i>
      <i>DZ</i>
      <i>dz</i>
    <reset>\u0428</reset> 
      <i>\u0448</i> 
      <i>\u0160</i> 
      <i>\u0161</i> 
  </rules>
  </collation>

рестартујте MySQL сервер и воила, имате нову колацију:

mysql> show collation like '%serbian%';
+-----------------+---------+------+---------+----------+---------+
| Collation       | Charset | Id   | Default | Compiled | Sortlen |
+-----------------+---------+------+---------+----------+---------+
| utf8_serbian_ci | utf8mb4    | 1200 |         |          |       8 |
+-----------------+---------+------+---------+----------+---------+
1 row in set (0.00 sec)
mysql> select 'latinica' = 'латиница';
+---------------------------------+
| 'latinica' = 'латиница'         |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select _utf8mb4 'latinica' collate utf8_serbian_ci  = _utf8mb4 'латиница' collate utf8_serbian_ci;
+----------------------------------------------------------------------------------------------+
| _utf8mb4 'latinica' collate utf8_serbian_ci  = _utf8mb4 'латиница' collate utf8_serbian_ci         |
+----------------------------------------------------------------------------------------------+
|                                                                                            1 |
+----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

O autoru

Bogdan Kecman

40 komentara

  • Vezano za kontrakcije, trenutno je napravljeno da su

    ђ, đ i dj isti karakter (dj je kontrakcija)
    љ, lj i lj isti karakter (lj je kontrakcija)
    њ, nj i nj isti karakter (nj je kontrakcija)
    џ i dz su isti karakter (dz je kontrakcija)

    ovde postoji problem sa џ pošto bi trebala da postoji i kontrakcija dž ali trenutno MySQL ne podržava kontrakciju između 7bitnog i utf8mb4 karaktera. Ovaj limit je ukljonjen u MySQL 5.6.x ali dotični je tek celosia stablo tako da neće još neko vreme biti blizu GA.

  • Извињавам се ако идем даље од теме али хтео бих да нагласим да има једна нетачна ствар коју сте написали на почетку текста а то је „Као земља са два равноправна писма..“

    Ми нисмо земља са два равноправна писма. Имамо само једно писмо и то је ћирилица. Латиница није наше званично писмо већ хрватско. То се може наћи у уставу Србије и Хрватске.

    Још једном се извињавам за скретање са теме.
    Иначе леп и једноставан текст. Хвала ти још једном Богдане зато што своје слободно време користиш да помогнеш људима.
    Поздрав.

  • Stvarno ?!

    Ja sam se zadnji put bavio „pismima“ kada sam organizovao sa par drugara prevodjenje open office-a i tada je bilo (~2000. – 2001.) i tada su mi gospoda iz akademije nauka i iz vukove zaduzbine ispricali kako su „dva ravnopravna pisma“ i objasnili zasto je to lose i ispricali gomilu problema koje zemlja ima zbog te odluke. Nemam pojma kada je to promenjeno, ali ako jeste – super, hvala za informaciju!

    Inace, sama cirilica funkcionise ok, bez ikakvih promena, utf8_general_ci sortira i poredi cirilicu pravilno, tako da ako latinica vise nije „nase“ pismo onda default kolacija „radi posao“…

  • добар чланак, по обичају

    што се примедбе о писмима тиче, ћирилица и латиница су равноравна писма при чему прво има предност (обавезно је за званична документа државна, нпр)
    иначе, има неких теорија да је латиница старија од ћирилице (причам за српски језик, не уопштено)

  • nije da je wikipedija uvek „siguran izvor“ ali:

    Po pravopisu, ćirilica i latinica su standardna pisma savremenog standardnog srpskog jezika (dvoazbučje). Po ustavu iz 2006. u službenoj upotrebi u Republici Srbiji, na celoj njenoj teritoriji je srpski jezik i ćirilično pismo, kao i u Republici Srpskoj. Službena upotreba latinice je regulisana zakonom i u zvaničnoj je službenoj upotrebi u sredinama gde su prisutne manjine koje koriste latinicu, dok u Crnoj Gori službeno pismo kao takvo ne postoji, pa se i u službene svrhe ravnopravno koriste oba standardna pisma crnogorskog, odnosno srpskog jezika. Ustav, i uopšte država, može svojim aktom odrediti koji će jezik biti u službenoj upotrebi u državnim organima, pa samim tim i koje će pismo biti u službenoj (administrativnoj) upotrebi. Tako je 2006. ustavom ćirilica proglašena službenim pismom državne uprave na celoj teritoriji Republike; međutim, često se pogrešno veruje ili tumači da ta ustavna odredba briše latinicu – zakon se ne bavi jezičkom normom ni na koji način, te su standardna pisma standardnog srpskoj jezika, kao i do tada ostale i ćirilica i latinica.

    Sve u svemu, nisam pravnik da umem da tumacim sve te gluposti koje pisu po tim debelim pravnim knjigama (ili tankim crvenim), nemam potrebu da dokazujem sebi ili drugima da sam veliki Srbin tako sto cu da pisem cirilicom, ne osecam da mi neko nesto uzima/otima … a i ova zemlja takva kakva je mi nije nesto „jasna“, rodio sam se u SFRJ, pa ziveo u SRJ, pa u RJ, pa u SCG pa evo sad u Srbiji .. te „nije budjav kruh nego budjav leba“ „doslednosti“ mi ne znace previse. Kapiram da nekome ko nije prosao sve to, ili ko je prosao nesto drugo (nesto su mu oteli, odnegde ga oterali) – kao sto mnogi citaoci ovog bloga jesu, ima drugacije misljenje… no svakako treba znati sta je „zvanicno pismo zemlje u kojoj zivimo“, nebitno da li cemo ga koristiti ili ne. Tako da ako neko ima siguran izvor za to sta je zvanicno pismo, nega ga slobodno predstavi, varijente „mi protiv njih“ me ne zanimaju

  • Хвала на тексту… Сад коначно више не могу да се позивам на рану имплементацију сличног механизма из 2002. у MySQL-у — мада са рекомпилацијом — http://danilo.segan.org/blog/prevod/mysql-i-kolacija ;)

    Проблем који тада нисам успео да решим је LIKE подршка (није да сам се много трудио, ал’ ипак), тј. да ли LIKE може да игнорише разлике између писама? То би било корисно додати.

    И наравно, било би лепо да ове табеле постану стандардни део MySQL и осталих деривата.

  • Like radi komparaciju po kolaciji isti kao i ostali delovi mysql-a:

    mysql> select SQL_NO_CACHE a from sr_test where a like (‘ab%’);
    +————+
    | a |
    +————+
    | ABVGD |
    | abvgd |
    | АБВГД |
    | абвгд |
    +————+
    4 rows in set (0.00 sec)

    sto se tice „standardni deo mysql-a“, najverovatnije ce biti u 5.6 (posto je tamo dz reseno kako treba)

  • Ako zelite jednakost izmedju ČĆC .. onda nešto ovako (nisam testirao kako radi, mozda sam zaboravio neko slovo):

    <collation name="utf8_serbian_ci" id="1200">
      <rules>
        <reset>\u0410</reset>
          <i>A</i>
          <i>a</i>
        <reset>\u0411</reset>
          <i>B</i>
          <i>b</i>
        <reset>\u0412</reset>
          <i>V</i>
          <i>v</i>
        <reset>\u0413</reset>
          <i>G</i>
          <i>g</i>
        <reset>\u0414</reset>
          <i>D</i>
          <i>d</i>
        <reset>\u0402</reset>
          <i>\u0110</i>
          <i>\u0111</i>
          <i>\u0189</i>
          <i>Dj</i>
          <i>DJ</i>
          <i>dj</i>
        <reset>\u0415</reset>
          <i>E</i>
          <i>e</i>
        <reset>\u0416</reset>
          <i>\u017D</i>
          <i>\u017E</i>
          <i>\u0417</i>
          <i>Z</i>
          <i>z</i>
        <reset>\u0418</reset>
          <i>\u0419</i>
          <i>\u0439</i>
          <i>I</i>
          <i>i</i>
        <reset>\u0408</reset>
          <i>J</i>
          <i>j</i>
        <reset>\u041A</reset>
          <i>K</i>
          <i>k</i>
        <reset>\u041B</reset>
          <i>L</i>
          <i>l</i>
        <reset>\u0409</reset>
          <i>\u01C7</i>
          <i>\u01C8</i>
          <i>\u01C9</i>
          <i>Lj</i>
          <i>LJ</i>
          <i>lj</i>
        <reset>\u041C</reset>
          <i>M</i>
          <i>m</i>
        <reset>\u041D</reset>
          <i>N</i>
          <i>n</i>
        <reset>\u040A</reset>
          <i>\u01CA</i>
          <i>\u01CB</i>
          <i>\u01CC</i>
          <i>Nj</i>
          <i>NJ</i>
          <i>nj</i>
        <reset>\u041E</reset>
          <i>O</i>
          <i>o</i>
        <reset>\u041F</reset>
          <i>P</i>
          <i>p</i>
        <reset>\u0420</reset>
          <i>R</i>
          <i>r</i>
        <reset>\u0421</reset>
          <i>S</i>
          <i>s</i>
          <i>\u0428</i>
          <i>\u0448</i>
          <i>\u0160</i>
          <i>\u0161</i>
        <reset>\u0422</reset>
          <i>T</i>
          <i>t</i>
        <reset>\u040B</reset>
          <i>\u0106</i>
          <i>\u0107</i>
        <reset>\u0423</reset>
          <i>U</i>
          <i>u</i>
        <reset>\u0424</reset>
          <i>F</i>
          <i>f</i>
        <reset>\u0425</reset>
          <i>H</i>
          <i>h</i>
        <reset>\u0426</reset>
          <i>C</i>
          <i>c</i>
          <i>\u0427</i>
          <i>\u010C</i>
          <i>\u010D</i>
        <reset>\u040F</reset>
          <i>\u045F</i>
          <i>\u01C4</i>
          <i>\u01C5</i>
          <i>\u01C6</i>
          <i>Dz</i>
          <i>DZ</i>
          <i>dz</i>
       
      </rules>
      </collation>
    
  • Vuk Karadžić je izvršio reformu latinice a ne Jernej Kopitar kako se doskora mislilo. Hrvati nisu nikako mogli da prisvoje ćirilicu pa su svojatali latinicu, a mi se počeli gaditi na latinično pismo.

    Naša je latinica i ćirilica.

  • Kad smo pricali pre 5 godina mogucnost sa XML-om nije postojala :(, samo ona „ubildovana“ varijanta. U 5.6 koji ima validnu kontrakciju za dz srpska kolacija (ovakva kao ova iz posta) bi trebala da se nadje u glavnom kodu (najzad).

  • Скоро сам нашао устав републике Србије и нађох члан у коме се дефинише језик и писмо, па сам се сетио дискусије овде. Тамо имамо следећу ствар:

    Језик и писмо
    Члан 10.
    У Републици Србији у службеној употреби су српски језик и ћириличко писмо.
    Службена употреба других језика и писама уређује се законом, на основу устава.

    Коментар није потребан, дилема је разрешена.

  • Malo kasnim sa čitanjem članka i mislim da je odličan jedino što meni posle opisanog postupka i dalje ne radi kako treba.
    Sama ćirilica se sortira kako treba, i latinica takođe ali ne i zajedno. Odnosno

    mysql> select _utf8mb4 ‘latinica’ collate utf8_serbian_ci = _utf8mb4 ‘латиница’ collate utf8_serbian_ci;

    Meni vraća 0 a ne 1.

    Posle „show collation“ jedina razlika između ove nove i ostalih kolacija je što ova nova nije „compiled“. Da možda ipak ne treba da se rekompajlira mysql??

    Verzija mysql-a je 5.1.49

  • ne vezano za problem, savetujem ti da bezis sa 5.1 na 5.5 …

    sto se tice problema, koji ti je ID kolacije?

    ako si napravio XML fajl kako je u postu jedina mogucnost je da ti je ID „pogresan“ (5.5 i 5.1 imaju razlicte pocetne id-ove za xml kolacije) ili da ti je kolacija „prevelika“, tj da si dodavao nesto sto nije u xml-u iz ovog posta

  • Hvala na odgovoru. ID kolacije mi je 240, trebalo bi da je to u redu. Evo jedan izvod iz SHOW COLLATION, nadam se da će se lepo videti. Jedina razlika u odnosu na ostale kolacije je što nije „Yes“ u „Compiled“ koloni.

    | utf8_hungarian_ci | utf8mb4 | 210 | | Yes | 8 |
    | utf8_serbian_ci | utf8mb4 | 240 | | | 8 |
    | ucs2_general_ci | ucs2 | 35 | Yes | Yes | 1 |
    | ucs2_bin | ucs2 | 90 | | Yes | 1 |

  • nije compiled zato sto je XML a ne ukompajlirana, to je ok.

    to mi moralo da sljaka, sad cu da vidim dal imam negde pri ruci neki 5.1 da probam

  • cudno, ne radi ni meni sa svezim 5.1 … nemam pojma sta je problem bas cu da proverim … sa 5.5 radi lepo

  • Error

    SQL query:

    ALTER TABLE `opstina` CHANGE `opstina` `opstina` VARCHAR( 30 ) CHARACTER SET utf8mb4 COLLATE utf8_serbian_ci NOT NULL

    MySQL said: Documentation
    #1005 – Can’t create table ‘autopijac.#sql-928_7’ (errno: 1005)
    U cemu je problem niti mogu da promenim utf8mb4 u utf8_serbian_ci niti da napravim novu tabelu sa utf8_serbian_ci ?
    A komanda :
    mysql> select ‘latinica’ = ‘латиница’;
    kod mene se pretvara u:
    mysql> select ‘latinica’ = ‘????????’;

  • Ako ne mozes da promenis u tu kolaciju znaci da ti kolacija ne valja. Proveri sa show collation sta kaze mysql da ima od kolacija.

    Ovaj select ti je otisao u ??? zato sto mysql cli nije utf8, kada startas mysql cli kucni prvo jedno „set names ‘utf8’;“

    Nadam se da to sve radis sa 5.5, 5.1 nesto zeza sa ovom procedurom nisam ga dugo probao

  • Podesio sam charset utf8mb4 ali i dalje nece,kad koristim phpMyadmin on vidi utf8_serbian_ci ali opet nista.Naravno koristim 5.5 verziju.

    mysql> charset utf8
    Charset changed
    mysql> show collation like ‘%serbian%’;
    +—————–+———+——+———+———-+———+
    | Collation | Charset | Id | Default | Compiled | Sortlen |
    +—————–+———+——+———+———-+———+
    | utf8_serbian_ci | utf8mb4 | 1200 | | | 8 |
    +—————–+———+——+———+———-+———+
    1 row in set (0.00 sec)

    mysql> select ‘latinica’ = ‘????????’;
    +————————-+
    | ‘latinica’ = ‘????????’ |
    +————————-+
    | 0 |
    +————————-+
    1 row in set (0.00 sec)

    mysql>

  • probaj da cimnes taj upit iz phpmyadmin-a. Izleda da tvoja konzola ne zna sta je utf8

  • Hm… Ovo bi bilo extra kad bi mi proradilo. Koristim mysql 5.1 pod linuxom (Ubuntu) i uradim sve kako si rekao, izmenim Index.xml fajl, sačuvam, restartujem bazu… ali nema nove kolacije :(

  • Ja ne stizem to da probam na 5.1 vec mesecima … Zasto ne predjes na 5.5 mnoooooogo je bolji od 5.1 ?

    Kada stignem da probam ovo na 5.1 updateovacu post ali nekako uvek imam nesto pametnije da radim :)

  • U ubuntu repozitorijumu, 5.1 stoji kao poslednja verzija, 5.5 bih dakle morao instalirati ručno što je malo cimanje. al nije frka, bitno mi je da znam da to radi u 5.5 kad mi bude trebalo za neki komercijalni projekat uzeću 5.5, za sad ću iskoristiti 5.1 za ovaj studentski projekat :)

  • Ja znam da su korisnici Ubuntu distro-a prilicno lenji ali vec jedno 10tak puta sam na nekoliko mesta spomenuo da MySQL koji dolazi uz distro-e ne valja. Ne moze da se poredi sa binaries koje mozes da skines sa dev.mysql.com. Osnovni problem je to sto svaki distro mora da postuje svoja „pravila“ (npr RH mora da koristi sve biblioteke kao so, nema statickog linkovanje nicega, major i minor verzija moraju da ostanu iste tokom jedne verzije distro-a etc… Ubuntu ima svoja pravila SUSE svoja …) i svi oni ako hoce da ispostuju pravila koja vaze za „sve pakete“ nikako ne mogu da naprave optimalni binaries za database server.

    Rucna instalacija na Ubuntu se svodi na to da skines Linux – Generic 2.6 (x86, ##-bit), Compressed TAR Archive sa dev.mysql.com i raspakujes ga u /usr/local/mysql i to je to, sredis /etc/my.cnf i vozi misko

    E sad ako bas oces da ides po turubuntu praxi onda isprati uputstvo odavde:
    http://geek.co.il/wp/2011/03/02/mysql-5-5-on-ubuntu-10-10

  • pozdrav, imam slican problem kao Marko, br 17, od May 25, 2011.

    SHOW COLLATION; mi lepo pokaze
    |utf8_serbian_ci|utf8|1600|||8|

    … ali ne mogu da kreiram tabelu koja bi koristila utf8_serbian_ci, niti da promenim neko od postojecih polja u utf8_serbian_ci.

    u pitanju je mysql 5.5, na fedori 15.

    inace, isto ovo uputsvto sam koristio pre otprilike godinu dana i sve je bilo ok…

    pls help ako je moguce.

  • DODATAK:

    eee, uspeo sam, id mi je bio prevelik, kada sam stavoi 240, sve je proslo ok!

    hvala u svakom slucaju, i jos vece hvala na izuzetnom uputstvu!

  • Ako nekome ne funkcioniše naša kolacija, to je zbog toga što kod koji ubacujete treba da se nalazi između tagova koji zatvaraju collation i charset tj.

    kod ide ovde…

  • Pozdrav i hvala za tekst,

    Koliko sam razumeo kolacija i uporedjivanje vezano za [dz,dž] == џ bi trebalo da radi u 5.6?

    Testiram medjutim dobijam negativan odgovor.

  • iskreno, nisam ispratio sta se desava sa kolacijama posto smo imali mnogo novosti u klasteru pa ne stizem sve. 5.6 je trebalo da dobije podrsku za dvoslovnu kolaciju, da li je dobio ili ne, nisam ispratio, bas cu da proverim… e sad, to sto je dobio podrsku za dvoslovnu kolaciju samo znaci da mogucnost za [dz,dž] == џ ali ne i da je sama ta kolacija napravljena. Ja sam probao da ubacim srpsku kolaciju u mysql ali problem je sto to mora da se uradi „zvanicno“ te smo mi trazili od srbistanske vlade zvanicno dokument sta je srpska kolacija i preko 3 meseca lelemudjenja po srbiji dobili smo odgovor iz neke od institucija ovih bajatih lelemuda da njih nista osim cirilice ne zanima a da se cirilica vec sortira kako treba po unicode-u te da sto se njih tice ћ != ć zato sto je jedno srpski a drugo hrvatski i tu nema sta da se „jednaci“ … sve u svemu retardi koji se u srbistanu pitaju za te stvari nemaju ideju koji su realni problemi sa kojima se korisnici susrecu i nece da izdaju zvanicni dokument a oracle nece da napravi kolaciju bez istog i da je „ugradi“ u mysql … e sad, mi mozemo da napravimo koliko hocemo externih kolacija (mi == korisnici) sto je i bila poenta ovog mog posta, da pokazem kako se prave externe kolacije koje resavaju probleme sa kojima se susrecemo .. doduse tada je bila prica da ce 5.6 umeti da radi sa dvoslovnim, da li je vlad dodao tu mogucnost ili ne – kao sto rekoh, nisam ispratio, pitacu ga u ponedeljak :D, znam da nije bilo visoko na listi prioriteta za 5.6

  • Poz jos jednom i thx za brz odgovor.

    Da, za testiranje sam koristio kolaciju iz ovog teksta.

    Srbistan – Jbg.a verovatno ne kontaju ni sta ste im ustvari trazili. Zalosno al tako je..

    Iako mi je tvoj tekst odgovorio na pitanje na koje sam dugo trazio odgovor! jedna stvar me jako buni.

    Primera radi, sta uraditi ako pravimo visejezicni sistem koji treba da cuva tekstualne clanke. Podrazumevanu kolaciju mozemo podesiti na nivou tabele, medjutim kako efikasno resiti problem kada izbor kolacije za poredjenje i sortiranje zavisi od jezika korisnika.

    Srpski – utf8_mojacirlatkolacija_ci (neka bude podrazumevana)
    Nemacki – utf8_german2_ci
    Svedski – utf8_swedish_ci

    ostali – utf8_general_ci

    Mozemo koristiti COLLATE u samom kveriju medjutim procitah da bi to jako uticalo na performanse pri pretrazi. Ili postoji neki efikasniji pristup celoj tematici… :/

  • Na zalost sve si skapirao tacno :D
    – cuvas podatke kao utf8mb4 ili neki slican
    – definises „najcesce koriscenu kolaciju na nivou polja/tabele“
    – kada ti bas treba druga kolacija promenis je u upitu (i to ozbiljno platis performansama)

    Generalno je general_ci zadovoljavajuc za 99% slucajeva, vrlo su retki slucajevi dvoazbucnih jezika kao sto je srbistanski (ili po novim pisanijima vise nije zvanicno dvoazbucni jer su izbacili latinicu iz liste srpskih pisama, retardi, ali je de-fakto i dalje dvoazbucni, ili jos bolje tro-azbucni posto je u upotrebi u racunarskom svetu realno i cirilica i latinica i osisana latinica) .. ja sam to u svojim multijezicnim projektima resavao adaptiranjem general_ci dodavanjem jednacenja latinice i cirilice i to je to …

    sta je fora, general ci vec jednaci akcentovana i ne akcentovana slova (Č, Ć, C su isti) sto je realno ono sto meni u 100% slucajeva odgovara, samo jos da dodam tu i Ц и Ђ i meni je to full zadovoljavajuce resenje … sad, vrlo cesto ljudi to ne zele i zele da su to razlicita slova i da ih razlicito koriste (pa teraju slovenian_ci gde su to razlicita slova) no kao sto rekoh, meni je to uvek nepotrebno posto gde god sam bilo sta radio uvek je 90+ % teksta bilo u osisanoj latinici tako da mi razdvajanje tih slova samo smanjuje pretrazivacke mogucnosti i nista drugo… sortiranje kao drugi deo kolacije mi realno nikad nije bio bitan…

    na taj nacin sa blago modifikovanim general_ci dobijem pokrivenost svega, gde se pise jednoazbucno problem ne postoji, gde se pise viseazbucno, jbg, za srbistan imam resenje, za onih tri ipo druge dvoazbucne zemlje u svetu me bas briga :D

  • btw evo pitah ove momke, od 5.6.1 je u mysql implementirana hrvatska kolacija koja ima tailoring. Evo ga deo iz worklog-a za taj task:


    Tailoring
    ---------
    &C < č <<< Č < ć <<< ĆD < dž = dž <<< dŽ <<< Dž = Dž <<< DŽ = DŽ < đ <<< ĐL < lj = lj <<< lJ <<< Lj = Lj <<< LJ = LJN < nj = nj <<< nJ <<< Nj = Nj <<< NJ = NJS < š <<< ŠZ < ž <<< ŽThe same, using code notation:&C < \u010D <<< \u010C < \u0107 <<< \u0106&D < d\\u017E = \u01C6 <<< d\u017D <<< D\u017E = \u01C5 <<< D\u017D = \u01C4 < \u0111 <<< \u0110&L < lj = \u01C9 <<< lJ <<< Lj = \u01C8 <<< LJ = \u01C7&N < nj = \u01CC <<< nJ <<< Nj = \u01CB <<< NJ = \u01CA&S < \u0161 <<< \u0160&Z < \u017E <<< \u017D

    References
    ----------

    Unicode database
    http://www.unicode.org/Public/UNIDATA/UnicodeData.txt
    (This is for reference only -- we won't support the latest version.)

    Croatian CLDR file
    http://unicode.org/cldr/trac/browser/trunk/common/collation/hr.xml

  • Zvuci prihvatljivo sto si napisao vezano za multijezicke projekte.

    Medjutim prevrnuh dokumentaciju da vidim kako se ekstenduje neka kolacija, kako bih na general_ci dodao jednacenje latinice i cirilice ali ne nadjoh nista konkretno pa ako moze neki hint :?

    Ne znam da li je za ovu temu, ali kako radi Full Text sa nasim sadrzajem, posto natural language mode definise engleske „stop“ reci i sl? ili koriscenje „WITH QUERY EXPANSION“, ili soundex() da bi se nasle slicne reci.

  • nisam siguran da moze da se extenduje bilo koja kolacija, ali kada pravis svoju kolaciju ovako kako sam ja ovde napisao (sa reset ovo, reset ono) ti extendujes general_ci (koji je neki default unicode case insensitive), e sad ako bi hteo da extendujes neku specificnu kolaciju mislim da to ne moze ovako jednostavno

    za fts, do skoro jedino je myisam podrzavao fts a iskreno, za bilo koji sadrzaj koji se menja myisam je beskoristan a innodb i fts nisu isli zajedno tako da razlicite varijante resenja postoje – sto generisanje svog indexa (ja sam pravio neke varijante sa soundex bas zbog srpskog i beskrajno mnogo nacina da napises istu rec, sto azbucno sto deklinacije sto vremena ) sto koristenje externih resenja (citaj sphinx koji svakako radi bolje od fts-a) sto koristenje dual baze gde bi se ono sto se pretrazuje fts nalazilo van mysql-a (citaj lucene) ..

    danas kada ibd podrzava fts, sta znam, ja i dalje koristim sva ona alternativna resenja :D

    sto se tice naseg sadrzaja i fts, u 5.6 nije neki problem, utf8mb4 radi ok

    http://dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html

    Full-text searches can be used with most multi-byte character sets. The exception is that for Unicode, the utf8mb4 character set can be used, but not the ucs2 character set. Although FULLTEXT indexes on ucs2 columns cannot be used, you can perform IN BOOLEAN MODE searches on a ucs2 column that has no such index.

    The remarks for utf8mb4 also apply to utf8mb4, and the remarks for ucs2 also apply to utf16, utf16le, and utf32.

  • Thx. Pretpostavio sam da mozda ekstenduje general_ci koji je i primary, medjutim problem koji sam primetio a koji se javlja se je da se gube sva jednacenja iz general_ci za svako novodefinisano slovo.

    Primer:
    uf8_general_ci kaze da je ä == a

    utf8_mojcirlat_ci kaze da je ä != a (koriscen )

    Da li mozda znas da li postoji neki dokument gde je na slican nacin opisana utf8_general_ci kolacija?

Ključne Reči

Kategorije

Blog