[ cartmanlee @ 30.03.2005. 09:27 ] @
| Radim tražilicu za site i potrebno je pretraživati brodove i vlasnike brodova. Zapisi se nalaze u bazi No stvar ne funkcionira kako bi trebala.
Prvi problem:
ako koristim SQL upit da pronađem brod "Brod", onda rezultat neću dobiti ako upišem "brod". Problem sam riješio tako što sam prvo izvukao sve brodove iz baze i onda sa strpos pregledavao da li dohvaćeni zapis sadrži niz "Brod". Za svaki slučaj koristim i SQL i ovaj drugi način.
Drugi problem:
Ako tražim ime vlasnika, npr. "Željko", stvar ne funkcionira, jer strpos ne funkcionira svaki put kada imam neke "hrvatske" znakove.
Da li netko ima ideju kako rješiti ovaj problem?
[Ovu poruku je menjao Goran Rakić dana 30.03.2005. u 14:16 GMT+1] |
[ Goran Rakić @ 30.03.2005. 09:45 ] @
U MySQL-u kada koristis LIKE nad poljima koja su Varchar ili Text, upit je automatski case-insensitive tako da ne bi trebalo da bude problema
http://dev.mysql.com/doc/mysql/en/case-sensitivity.html
Ako bas moras da koristis SELECT umesto LIKE-a, onda mozes da upotrebis nesto nalik na:
Code:
SELECT * FROM table WHERE lcase(ime)=lcase('Broj')
[ cartmanlee @ 30.03.2005. 11:30 ] @
[ Goran Rakić @ 30.03.2005. 13:15 ] @
A kako sam ja to mogao da znam?
Stvarno, kada cete vec da se naucite da svoj problem
detaljno opisete, koristeci realan primer, u realnom okruzenju,...
Odgovor:
http://www.devdaily.com/blog/Content/2/7/62/
Odgovor 2:
Google: PostgreSQL case insensitive:
http://www.google.com/search?q=PostgreSQL+case+insensitive
Takodje sam ti izmenio i naslov teme, kako bi drugi mogli preko pretrage lakse naci.
[ cartmanlee @ 30.03.2005. 16:05 ] @
OK, take it easy. Post sam napisao nabrzaka jer sam bio u gužvi.
Našao sam rješenje. Prvo je sa ovim pattern matching operatorima
SELECT ime FROM clanovi WHERE ime ~* 'Željko';
Kao što postoji lcase funkcija u MySQL, tako u PostgreSQLu postoji lower funkcija koja sva slova pretvara u mala.
Međutim, problem nije bio u SQL upitima, nego u tome što su admini nedavno radili neke promjene na PgSQL serveru, pa su na podesili client_encoding na SQL_ASCII, a ne na LATIN2. Prije nekih mjesec dana sam podesio client_encoding na LATIN2, ali očito je NETKO to promijenio. Sad sam za svaki slučaj ubacio dodatni SQL naredbu u index.php.
[ The Sekula @ 31.03.2005. 09:31 ] @
Mislim da je generalno lose resenje za ovakve stvari se oslanjati na podrsku same baze, pogotovo ako recimo imate veliki broj zapisa, te vam je koriscenje indeksa neophodno.
Kada mi je potrebno case-insensitive i "nasa slova"-insensitive pretrazivanje najcesce mi se kao najbolje resenje pokazalo dodavanje novog polja gde bi prilikom insert-a i update-a kesirali vrednost polja koje se pretrazuje, tako sto se nasa slova zamene sa ccszdj i ceo string prebaci u lower-case. Polje se lepo indeksira, a resenje je nezavisno od DB platforme. Postoji doduse i drawback, a to je da ako pretrazujete po "ćerka" dobicete i zapise gde se pominje "čerka", ali to se moze smatrati i kao feature ;-).
Slicno resenje se moze primeniti, ako je recimo potrebno pretrazivanje po kraju stringa, a nije moguce indeksirati po funkciji. Tada u takvo dodatno polje se upise string sa karakterima u obrnutom redosledu, te se i ono moze "normalno" indeksirati.
Sem za pretrazivanje, ovakva polja su zgodna i za sortiranje.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.