DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   SQL baze podataka - Sponzor: Baze-Podataka.net (http://www.devprotalk.com/forumdisplay.php?f=10)
-   -   MySQL, UTF8 i sort po naški (http://www.devprotalk.com/showthread.php?t=1736)

Pedja 01. 11. 2006. 11:45

MySQL, UTF8 i sort po naški
 
Muci me jedan problem. Podaci u tabeli su UTF, i odna stana za polje je utf i sve lepo radi (na sajtu se vide nasa slova, TOAD cit aipise u utf8) ali ORDER BY ima kvaku. Naime ne razlikuje s i š. Njemu je to isto slovo. Ne bi bio toliki pbroblemkad abi bar u sortu prvo stavi sve na s pa onda sve na š ali ne, on prostor ne pravi nikakvu razliku...

Ubih se tražeći na netu neki hint ali što više tražim sve više mise čini da je ovo nerešen problem.

Nije valjda da ću morati da pristupim starom dobrom dupliranju kolone da bih u dodatnu upisivao oblik teksta koji se da ispravno sortirati?

dinke 01. 11. 2006. 12:41

Mislim da je problem do collation-a. Probaj da setujes na slovenacki - utf8_slovenian_ci (koliko vidim samo on postoji).

zextra 01. 11. 2006. 13:54

Nedavno sam izgubio par sati tragajuci za odgovarajucim UTF8 i UCS2 collation-om za nasu azbuku/abecedu, i ni traga od savrsenog resenja.

Naime, problem je u tome sto postojeci collationi, iako uglavnom korektni, ne obracaju paznju na neka nasa slova, kao i u tome sto je za nas jezik potreban dvoslovni collation (zbog slova kao sto su dž, nj, lj, koja se nalaze na pogresnom mestu prilikom sortiranja). Tada sam natrcao na post na ES-u (randomov, cini mi se), u kom je objasnjeno kako napraviti sopstveni collation, a zatim ga i kompajlirati.

Sto se cirilice tice, tu je pesma malo drugacija, ali nista veselija.. Cirilica nema dvokarakternih slova, ali zato ne postoji ni srpski cirilicni collation :)

Ukratko, imas mysql komandu SHOW COLLATION, pa vidi sta ti je na raspolaganju, i igraj se malo dok ne vidis sta ti najvise odgovara.

Dragi Tata 01. 11. 2006. 14:19

Citat:

Originalno napisao zextra
Nedavno sam izgubio par sati tragajuci za odgovarajucim UTF8 i UCS2 collation-om za nasu azbuku/abecedu, i ni traga od savrsenog resenja.

Nedavno je Siniša iz MySQL ekipe kukao na ES-u kako niko iz Srbije neće da sedne da napravi srpski collation.

caboom 01. 11. 2006. 14:53

well... on je na mysql paycheck-u, nista ga ne sprecava da contribuje malo. :)

Dragi Tata 01. 11. 2006. 15:07

Citat:

Originalno napisao caboom
well... on je na mysql paycheck-u, nista ga ne sprecava da contribuje malo. :)

Ili ako on nema vremena, MySQL AB može lepo da plati nekom da to uradi. Ali naravno, lakše je kukati kako niko neće da "doprinese" :)

caboom 01. 11. 2006. 15:10

exactly :)

Ilija Studen 01. 11. 2006. 15:32

Citat:

Originalno napisao Dragi Tata
Ili ako on nema vremena, MySQL AB može lepo da plati nekom da to uradi. Ali naravno, lakše je kukati kako niko neće da "doprinese" :)

Pa pazi, sve ide po nekoj listi sa sve prioritetima. Koliko je MySQL AB-u važan srpski collation? S obzirom koliko firmi odavde plaća MySQL AB usluge strašno malo. Najverovatnije nemaju ništa od toga da dodaju taj feature osim gubitka vremena. Onaj kome je bitno može da ga doda pošto je kod dostupan, a razvojni proces otvoren.

Dakle, jasna situacija gde zajednica treba da gura u pravcu u kome žele da se stvari razvijaju.

Pedja 01. 11. 2006. 16:21

A koliki je to posao da se napravi collation? To je valdja samo tabela na osnovukoje se radi obrada.

Dejan Topalovic 01. 11. 2006. 20:31

Razgovarao sam ja sa Sinisom o srpskom collationu na cirilici i pitao ga zasto to nije uradjeno. Odgovorio mi je da su croatian collation uradili neki tipovi, koji nisu dio MySQL tima, a da se njemu srpski collation ne da raditi licno, posto je on sad Senior Support Manager i ne radi u developmentu kao ranije.

Dao mi je neka uputstva, gdje da nadjem informacije o tome i da pogledam neke primjere, pa sam ja kontao uraditi srpski collation za MySQL, ali nikako da uhvatim volje i vremena, da sjedem cestito i prionem na taj zadatak.

Mozda ako bismo ovdje svi zajedno pokusali, pa da iznjedrimo taj collation...

ivanhoe 02. 11. 2006. 01:02

ajde dajte nek linkove i informacije o pravljenju collation tabela, ono sto znate... cisto za pocetak, posto ja nikako da nadjem neke primere kako se to radi...

zark0vac 02. 11. 2006. 01:41

Unfortunately there is no documentation on how to create UTF8 collations.
But adding a new collation can be very easy. You need to edit these files:

strings/ctype-uca.c
mysys/charset-def.c

Use swedish as an example.

Also, note that:
1. Many languages are compatible with utf8_unicode_ci.
So you don't need to create separate collations for them.
For example German, French, Russian, Armenian, Greek.

2. Our Unicode Collation implementation have some limitations.
It is currently not possible to create real full featured collations for ALL languages.
For example, Hungarian have very complex contraction rules, i.e.
when a combination of several letters is treated as a single sorting element.

If you list all the languages you need, I could comment which of them can
be implemented easily, and which of them require additional coding.

http://forums.mysql.com/read.php?103...5093#msg-25093


Potrazicu clanke sa konkretnim uputstvima pa cu postaviti.

Dejan Topalovic 02. 11. 2006. 02:06

Slicne putokaze je i meni dao Sinisa, s tim da me uputio i na strings/ctype-utf8.c, konkretno na matrice MY_UNICASE_INFO, kao i na share/charsets XML datoteke.

Nazalost, nisam u praksi sa MySQL-om imao potrebu za cirilicom, pa tako ne mogu ni reci nesto iz licnog iskustva. Evo nabrzaka sam nesto testirao na cirilici koristeci cp1251_general_ci , pa cu sutra napisati vise o tome.

zark0vac 02. 11. 2006. 02:33

Cekamo rezultate :) Sad sam procitao da bi cp1251 (koji si koristio), koi8_ukr i win1251_ukr trebalo da podrzavaju cirilicu u potpunosti. Time will show. A sto se tice konkretnih uputstava za razvoj collationa slaba vajda, nigde nisam nasao.

Edit: http://downloads.mysql.com/docs/internals-en.pdf

Dejan Topalovic 03. 11. 2006. 00:04

Ne moze se koristiti cp1251 za collation. :(
Napravio sam par testova sa raznim collationima, pocevsi od
cp1251_general_ci, preko cp1251_ukrainian_ci, pa do cp1251_bulgarian_ci.

Kreirao sam jednostavnu tabelu sa dva polja:
Kôd:


CREATE
TABLE IF NOT EXISTS `test_cp1251` (
`id` tinyint(
3) unsigned NOT NULL auto_increment,
`ime` varchar(
45) CHARACTER SET cp1251 COLLATE cp1251_ukrainian_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE
=MyISAM;

Imena sam unio pomocu PHP-a tako sto sam kreirao staticki array sa imenima na cirilici i potom ih sa shuffle() promijesao prije unosa.

Kada pokusam unesena imena sortirati, dobijem slijedeci rezultat:
Kôd:

SELECT ime FROM test_cp1251 ORDER BY ime;
 
ime
------------
Чубрило
Синиша
Радиша
Жарко
Душан
Горан
Вељко
Бојан
Александар
Љубиша
Ђорђе

Idemo dalje za iste pare. :)

Dejan Topalovic 08. 11. 2006. 01:16

Mozda ipak ima sanse? ;)

Kôd:


CREATE TABLE IF NOT EXISTS `test_utf8` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`ime` varchar(45) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;

Imena sam kao i u prethodnom testu unio pomocu PHP skripte:
PHP kôd:

<?php
$conn 
= new mysqli('localhost''username''password');
$conn->select_db('dejan');
$conn->set_charset("utf8");
$conn->query("SET NAMES 'utf8'");
$array 
array(
'Александар','Бојан','Вељко','Горан','Душан','Ђорђе'
,'Жарко','Љубиша','Радиша','Синиша','Чубрило');
 
shuffle($array);
 
foreach(
$array as $ime)
{
$insert "INSERT INTO test_utf8 VALUES(NULL, 
'"
.$ime."')";
$result $conn->query($insert);
if(
$result)
{
echo 
"Ime ".$ime." je uneseno!<br>";
}
}
$conn->close();
?>

Nakon pokretana skripte, ispisu se unesena imena:
Citat:

Ime Горан je uneseno!
Ime Чубрило je uneseno!
Ime Ђорђе je uneseno!
Ime Синиша je uneseno!
Ime Жарко je uneseno!
Ime Радиша je uneseno!
Ime Вељко je uneseno!
Ime Душан je uneseno!
Ime Бојан je uneseno!
Ime Љубиша je uneseno!
Ime Александар je uneseno!
Provjerimo da li su imena unesena:
Kôd:


SELECT * FROM test_utf8;
 
id ime
1 Горан
2 Чубрило
3 Ђорђе
4 Синиша
5 Жарко
6 Радиша
7 Вељко
8 Душан
9 Бојан
10 Љубиша
11 Александар

I potom sortirano:
Kôd:


SELECT *
FROM test_utf8
ORDER BY ime;
 
id ime
11 Александар
9 Бојан
7 Вељко
1 Горан
8 Душан
3 Ђорђе
5 Жарко
10 Љубиша
6 Радиша
4 Синиша
2 Чубрило

Moglo bi biti korisno...

Ako neko ima vremena i volje, nek testira dalje, da li se ovaj collation moze koristiti ili ne.

Osim toga, koga zanima ovaj collation, moze detaljniji redoslijed sortiranja pogledati ovdje:
http://d.udm.net/bar/~bar/charts/utf8_unicode_ci.html

zextra 09. 11. 2006. 02:45

Hm, pa ovaj redosled je sasvim u redu. Pitam se sta sam prevideo kada sam testirao utf_unicode_ci collation? U svakom slucaju, UTF8 cirilica vise nije problem :)

Ali i dalje ostaje pitanje, sta sa latinicom? ;)

Pedja 09. 11. 2006. 08:43

I jos nezgodnije pitanje, sta ako su cirilica i latinica pomesani?

Dejan Topalovic 09. 11. 2006. 10:26

Citat:

Originalno napisao zextra
Hm, pa ovaj redosled je sasvim u redu. Pitam se sta sam prevideo kada sam testirao utf_unicode_ci collation? U svakom slucaju, UTF8 cirilica vise nije problem :)

Ali i dalje ostaje pitanje, sta sa latinicom? ;)

Za latinicu je preporucen hrvatski collation (latin2_croatian_ci).

@Pedja: Pa koliko vidim po redoslijedu, utf8_collation_ci bi trebao ispravno sortirati i kad je izmijesano, ali nisam siguran bez testiranja. Jebga, u zadnje vrijeme radim iskljucivo sa Oracleom, a jako malo sa MySQL-om, tako da iz prakse ne mogu nista reci...

zextra 26. 04. 2007. 19:41

Off Topic: Izvinjavam se što dižem temu iz mrtvih...


Maločas opet pogledah utf8_unicode_ci raspored, i primetih jednu stvar: u collationu se nalaze naša slova "dž", "lj" i "nj" kao jedno-karakterni simboli, i što je najbolje nalaze se na odgovarajućim mestima.

Ostaje pitanje: zašto Windows ne menja mapiranje tastera Q, W i X jedno-karakternim simbolima slova DŽ, NJ i LJ (verovatno sam omašio redosled respektivnih slova)? (Da nisam primetio da GNOME to radi, ne bih ni postavio ovo pitanje...) Sudeći po tom collationu, problem naših dvo-karakternih slova je rešen. Samo što retko ko može uopšte da koristi baš te znakove...

Jedine "zamerke" koje imam na collation je to što prilikom sortiranja, slova C, Č i Ć imaju istu težinu - tretiraju se jednako, baš kao i S i Š, Z i Ž), i to što ćirilična slova nisu uglavljena na odgovarajuće pozicije između latiničnih slova...


Vreme je GMT +2. Trenutno vreme je 13:16.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.