Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] LIKE %ł% - nie działa dla ł oraz Ł
Forum PHP.pl > Forum > Bazy danych > MySQL
mkdes
Czy wiecie, że jeśli macie tabele w kodowaniu utf8_general_ci to dla wszystkich polskich znaków działa szukanie bez polskich znaków.
Oprócz litery "Ł" oraz "ł".
Czyli szukając LIKE %lukasz% nie znajdzie wam rekordu ze słowem "łukasz".
Natomiast dla reszty działa dobrze, czyli np. szukając "kortka" znajdzie rekord ze słowem "kórtka".
Wiecie jak to rozwiązać?
Riklaunim
Ustaw collation tabeli na utf8 pl
Kod
alter table NAZWA_TABELI convert to character set utf8 COLLATE utf8_polish_ci;
mkdes
Nie, nie o to chodzi.
Twój sposób tym bardziej nie będzie działał.
Ja chcę odnaleźć rekordy zawierające literę "ł" kiedy w zapytaniu wpiszę "l".
gothye
przyłaczam sie do tematu ,aby nie zakładać nowego równiez mi zalezy aby wyszukiwać dane z tabel nie podająć w zapytaniu polskich znaków
modic
zmiana collation tabeli zmienia jedynie to że przy sortowaniu alfabetycznym Ł nie znajduje się na końcu listy, za Z, ale dalej nie wyszukuje sad.gif
Nie wiem czy to przypadkiem nie jest jakiś bug mysql, gdzieś na coś takiego natrafiłem
wiiir
skoro w bazie jest Ł a ty chcesz znales L to raczej zmiany kodowan nic nie dadza... musisz zrobic funkcje ktora bedzie ci tlumaczyc w zapytaniu wszystkie polskie znaki
Mchl
Właśnie dadzą dla ąćęóśżź ale nie dla ł.
http://bugs.mysql.com/bug.php?id=9604
MTF
Cytat(Mchl @ 25.02.2010, 09:36:52 ) *
Właśnie dadzą dla ąćęóśżź ale nie dla ł.
http://bugs.mysql.com/bug.php?id=9604


Nie umiesz przeczytać co chce kolo uzyskać?

Wpisujesz Laska a ma znaleść Łaska

jest różnica miedzy Laska a Łaska...

czyli gościu chce uzyskać efekt że jak analfabeta wpisze w polu Laska zamiast Łaska albo Lyzwy zamiast Łyżwy to mu i tak znajdzie poprawnie... Tak jak masz to w google...

Oczywiście najlepiej będzie napisać funkcje w php która wyszuka wszystkie rekordy zawierające wszystkie możliwości...

winksmiley.jpg
Mchl
Cytat(MTF @ 25.02.2010, 18:31:54 ) *
Nie umiesz przeczytać co chce kolo uzyskać?


questionmark.gif A z czego taki wniosek?
MTF
bo dajesz link do buga... który tu mu nie pomoże ;P trzeba napisać funkcje która za pomocą str_replace lub innej magicznej funkcji pozamienia znaczki i po każdej zmianie zapyta grzecznie baze danych czy coś takiego tam jest... potem wypisze to mu ładnie :ziewa:

co ma do tego bug?

może kiedyś go poprawia a jemu przestanie to działać tak?

myśleć w przyszłość trzeba ;P

-------------------

Jeśli poczułeś sie urażony to sorry ;P taki mam charakter ;P
Mchl
Bug to ma do tego, że powyżej pojawiły się sugestie, że zmiana algorytmu porównywania coś pomoże. Właśnie nie pomoże, bo od pięciu lat bug wisi, a MySQL go nie uważa za bug.

Dla Ciebie może taki link jest bezużyteczny, mnie się wydaje że warto mieć go w dyskusji, żebyśmy wiedzieli o czym w ogóle mowa.

Taki już mam charakter tongue.gif
MTF
Dobra dobra...


------------------------
ok!

załóżmy że wysyłasz POSTa w którym masz "Laska"... PHP go odbiera w funkcji która ma obsłużyć zapytanie...
do tej funkcji dopiszemy coś ale wcześniej stworzymy inną ;P Dla analfabetów...

  1.  
  2. function po_polskiemu($text) {
  3.  
  4. $text = str_replace ("l", "ł", $text);
  5.  
  6. // tu sobie pisz dalej jeśli chcesz... ale pytałeś o Ł tongue.gif
  7.  
  8. return $text;
  9.  
  10. }
  11.  


funkcja zamienia w textcie L na Ł za każdym razem! nawet jeśli to nie był bład!

i teraz w swojej funkcji w miejscu wyciagania z SQL musisz coś w podobie zrobić:
  1. SELECT * FROM twoja_tabela WHERE cos = $_POST['dane'] OR cos = po_polskiemu($_POST['dane'])


poradzisz sobie?

P.s. mogłem pogubić cudzysłowy bo pisane na kolanie ;P ale... mam nadzieje ze załapiesz ;P
Mchl
Problem się zacznie, jak chcąc wyszukać 'olałem' ktoś wpisze 'olalem' tongue.gif
MTF
Cytat(Mchl @ 25.02.2010, 19:14:15 ) *
Problem się zacznie, jak chcąc wyszukać 'olałem' ktoś wpisze 'olalem' tongue.gif

shit tego nie przewidziałem ;D to trzeba zapętlić ;D

albo.. nie wiem ;D

shit... zagiąłeś mnie... ;D
Mchl
A jesteśmy dopiero na pojedyńczych słowach. Pomyśl co by było gdyby chodziło o wyszukanie kilku? Każde kolejne l zwiększa dwukrotnie liczbę kombinacji.

Można próbować wyszukiwanie z wyrażeniem regularnym:
Kod
SELECT 'olałem' RLIKE 'o(l|ł)a(l|ł)em'
MTF
ok wiec można połączyć nasze rozważania ;P

znowu moja funkcja ale poprawiona na lepszejszą
  1.  
  2. function po_polskiemu($text) {
  3.  
  4. $text = str_replace ("l", "(l|ł)", $text);
  5. $text = str_replace ("L", "(L|Ł)", $text);
  6.  
  7. // tu sobie pisz dalej jeśli chcesz... ale pytałeś o Ł ;P
  8.  
  9. return $text;
  10.  
  11. }


a w SQL:

  1. SELECT * FROM tabela WHERE cos RLIKE po_polskiemu($_POST['dane']);


szanowny kolega widzi jakiś kolejny problem?
Mchl
Pomijając SQL injection?

Tylko taki, że niestety będzie to wolniejsze niż gdyby zajął się tym sam MySQL.
MTF
Cytat(Mchl @ 25.02.2010, 19:32:49 ) *
Pomijając SQL injection?

Tylko taki, że niestety będzie to wolniejsze niż gdyby zajął się tym sam MySQL.



coż uroki php...

no chyba że chce ręcznie przeszukiwać baze aaevil.gif

poza tym przedstawiliśmy rozwiązanie problemu.. niech sie wypowie autor winksmiley.jpg
mkdes
Co dziwne, wielkie Goo.... nie znalazło nic w polskich sajtach na ten temat.
No trudno, musiałem zrobić Test The West. Ale tu także nic.
Rozpoczęły się testy By MkDes.
Wyniki->
Żaden z systemów kodowania znaków dostepnych w bazie danych mysql nie pozwala na wyszukiwanie polskich znaków bez polskich znaków.
Prawie idealny jest typ character set utf8_general_ci - tylko ma problemy z literą "ł". nie znajduje wyrazów z "ł" łłłyyy jak wpisze "l" -lllyyyy.
No to może windows-1250. Super, jest łłłłłyyyyyy 'ł'.
Chwila zadowolenia, kolejne próby. Kur......a (kura) nie ma "ś"->"s". Czyli jak wpisze "s" to nie znajduje wyrazów z "ś".
Nie pomagały żadne COLLATE itp.
Jedynym rozwiązaniem jest usuwanie z danych polskich znaków i zapisywanie ich do oddzielnej tabeli, a potem wykorzystywanie tej tabeli podczas szukania.
Mysql plese, hear the woice from Poland, WE WANT CORRECT "L"->"Ł" interpretation in utf8_general_ci.

Jeśli pomogłem kliknij pomógł.

Additionals:
http://bugs.mysql.com/bug.php?id=9604
Riklaunim
A dlaczego wpisując "l" ma szukać także "ł" ? trochę nietypowe zachowanie wyszukiwarki, która zamiast "łaski" znajdzie "laski" winksmiley.jpg
Mchl
Szczęśliwi ci, którzy wszystkie dane mają wprowadzone poprawnie. U mnie na przykład co druga księgarnia, to 'ksiegarnia'.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.