Jak zrealizować select na bazie aby zwracał uwagę na wielkość liter i rozróżniał napisy np. "User" i "user"
Mam bazę danych z na serwerze z ustawieniem kodowań fontów:
character-set-server=utf8
collation-server=utf8_unicode_ci
Nie jestem tu asem ale z tego co wiem to "collation-server" oznacza stronę kodowa brana przy porównywaniu stringów. Jak zrobiłem sobie selecta na bazie to wyszło na to że select nie rozróżnia wielkości liter i np. na szukanie słowa "user" zwraca "User" i "user".
Ta cecha przyda mi sie jak dla wyszukiwarki zainstalowanej na mojej stronie ale powoduje problemy przy logowaniu userów. Np. Userzy mike i Mike uznawani sa z tych samych. Dla celów logowania userów (i sprawdzania ich haseł) musiałbym więc dokonywać dokładnych wyszukań sprawdzających wielkości liter.
Znalazłem w google dwa przykłady:
binary:
SELECT * FROM demo WHERE name = BINARY 'Foo';
i collocate
SELECT * FROM demo WHERE name = 'Foo' COLLATE utf8_bin;
Pytanie: Co jest lepsze dla działania na varchar i czy są jakieś ograniczenia (haczyki) dla tych zapytań. Czy nie będą się konfliktowały z jakimiś ustawieniami serwera (np. strony kodowej)?
Ja wiem tylko że w utf8_unicode_ci oznacza case insensitive. Możesz przed wywołaniem właściwego zmieniać na utf8_unicode/utf8_unicode_cs i tyle. Mam nadzieję że zadziała.
No pewno zadziała ale to ma być baza dla strony www a nie kilku sporadycznych zapytań więc zmiana stron kodowej dla collation za każdym razem gdy ktoś sie loguje wydaje mi się dość kłopotliwe. A na stałe nie chcę zmienic bo inaczej wyszukiwarka na stronie tez będzie szukała z uwzględnieniem wielkości liter co będzie wpływało na wyniki wyszukań.
Ustaw wszędzie case sensitive - a w wyszukiwarce w zapytaniu dasz LOWER i tyle. Np
select * from table where lower(`twoje_przeszukiwane_pole`)="Twoja szukana fraza"
a dodatkowo jeszcze po stronie serwera (php czy czego tam uzywasz) - zrób jakiś string.toLower... czy jakoś tak :)
axelbest napisał(a):
Ustaw wszędzie case sensitive - a w wyszukiwarce w zapytaniu dasz LOWER i tyle. Np
select * from table where lower(`twoje_przeszukiwane_pole`)="Twoja szukana fraza"
a dodatkowo jeszcze po stronie serwera (php czy czego tam uzywasz) - zrób jakiś string.toLower... czy jakoś tak :)
Ale pytający pytał tak: "Jak zrealizować select na bazie aby zwracał uwagę na wielkość liter i rozróżniał napisy np. "User" i "user"" :)
BINARY i tyle. Będzie dobrze :)
Dzięki