Generalni odgovor, ako sve radis kako treba (polje u tabeli je utf8, kacis se iz klijenta i setujes konekciju kao utf8) da promenis collation sa utf8_bin na neki drugi (utf8_unicode_ci na primer) i radice ti case insensitive pretraga, sa utf_bin collation-om pretraga je case sensitive.
Kako ti izgleda tabela, tj. koji ti je charset za polje po kom radis pretragu, i koji ti je collation za isto to polje?
Kako se kacis na bazu (php/jdbc/capi/c++api/odbc/...)?
Sta je cesta greska, ako na primer koristis PHP, napravis tabelu polje u tabeli koje je UTF8, na svojoj html strani uzimas input koji je UTF8, upisujes to u bazu i citas iz baze i sve "deluje" ok. Sta je problem, vrlo cesto nije ... primer:
Code:
<?php
mysql_connect("localhost", "pera", "pera");
mysql_use_db("test");
mysql_query("insert into pera values(1,2,3,'".$_GET['nesto']."')");
?>
sve i ako je cetvrti atribut u tabeli pera utf8 u njega ce biti upisana brljotina koja ce posle biti prikazana ok kada je procitas, ali je i dalje brljotina ... zasto?
$_GET["nesto"] u sebi sadrzi UTF8 string .. super . recimo da je to 3 slova cirilicom. Cirilica u utf8 zauzima 2 bajta po slovu, posto php konektor uvek pravi konekciju prema bazi kao latin1, desava se sledece, tih 6 bajtova ce php konektor poslati mysql-u kao 6 latin1 karaktera i to 3 sedmobitna i 3 osmobitna, mysql ce onda tih 6 latin1 karaktera snimiti kao 6 UTF8 karaktera u polje od kojih ce svaki zauzeti 3 bajta. Dakle, tvoja 3 cirilicna karaktera su u polju zauzela 18 bajtova a mysql ih vidi kao 6 karaktera. Ti kada to procitas to "izgleda" ok u html-u posto ti mysql vrati onih 6 karaktera koje ti prikazes, browser ih interpretira kao utf8 (posto mu to stoji u hederu) i ti to "vidis ok" ali to nije ok!!!
kako da resis problem ...
Code:
<?php
mysql_connect("localhost", "pera", "pera");
mysql_use_db("test");
mysql_query("SET NAMES utf8"); // OVO KAZE MYSQL-u DA CE PHP DA SALJE UTF8 a ne LATIN1 karaktere
mysql_query("insert into pera values(1,2,3,'".$_GET['nesto']."')");
?>
sada vise nemas problem i kada upisujes podatke i citas podatke saljes ih i primas kako treba, 3 cirilicna karaktera ce u bazi uzeti samo 9 bajtova (mysql za svaki utf8 karakter trosi uvek 3 bajta), mysql ce upisanu vrednost videti kao 3 a ne kao 6 slova i mocice da koristi collation da ih pravilno sortira, poredi i slicno...
ono sto je "veliki" problem je ako ti imas bazu koja je napunjena pogresno (dakle nisi imao set names=utf8 i app je tako radio godinu dana), sada ce dodavanje ovoga set names da napravi totalni dzumbus, stare zapise ces citati kao brljotine i slicno ... u ovom slucaju prvo moras da napises mali app koji ce da iskopira tabele (jedan po jedan red) u nove tabele i uradi retranskribciju polja koja su pogresno uneta u pravilno uneta polja, pobijes stare tabele i nastavis da radis sa novim tabelama ...
Sve ovo isto moze da se desi i sa drugim konektorima, razlika je samo u nacinu kako se setuje charset konekcije, u JDBC-u se to setuje u uri-u konekcije na primer...
Ne znam koliko ti ovo pomaze, ako si korektno unosio podatke u bazu, promena collation-a iz utf8_bin u bilo koji drugi bi trebala da resi problem, ako si pogresno unosio podatke, imas primer kako se to radi u php-u, ako si radio u necemu drugom nadji kako se setuje charset za konekciju, ako ne nadjes, tu smo pa pitaj. ako si ti menjao charset za polje iz utf8 u latin1 i podaci su ostali "ok" znaci da nisi punio podatke kako treba, da ti se cirilica nalazi u tabeli kao validan utf8 posle konverzije polja u latin1 video bi samo gomilu upitnika.
EDIT: zakacio sam ti primer php-a kako to sljaka
[Ovu poruku je menjao bogdan.kecman dana 17.12.2008. u 13:36 GMT+1]