Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [mysql] LIKE %ł% - nie działa dla ł oraz Ł
-mkdes-
post 19.02.2010, 07:45:29
Post #1





Goście







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ć?
Go to the top of the page
+Quote Post
Riklaunim
post 20.02.2010, 04:30:23
Post #2





Grupa: Zarejestrowani
Postów: 640
Pomógł: 44
Dołączył: 8.02.2004

Ostrzeżenie: (0%)
-----


Ustaw collation tabeli na utf8 pl
Kod
alter table NAZWA_TABELI convert to character set utf8 COLLATE utf8_polish_ci;


--------------------
Biblioteki: Skrypty, CMS | Kurs PHP | Python
Go to the top of the page
+Quote Post
-mkdes-
post 20.02.2010, 08:21:34
Post #3





Goście







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".
Go to the top of the page
+Quote Post
gothye
post 22.02.2010, 14:15:17
Post #4





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

Ostrzeżenie: (0%)
-----


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


--------------------
Nie udzielam pomocy poprzez PW
Go to the top of the page
+Quote Post
modic
post 25.02.2010, 02:34:51
Post #5





Grupa: Zarejestrowani
Postów: 64
Pomógł: 0
Dołączył: 18.07.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
wiiir
post 25.02.2010, 09:04:00
Post #6





Grupa: Zarejestrowani
Postów: 260
Pomógł: 34
Dołączył: 22.02.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Mchl
post 25.02.2010, 09:36:52
Post #7





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


Właśnie dadzą dla ąćęóśżź ale nie dla ł.
http://bugs.mysql.com/bug.php?id=9604
Go to the top of the page
+Quote Post
MTF
post 25.02.2010, 18:31:54
Post #8





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 25.02.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Mchl
post 25.02.2010, 18:35:28
Post #9





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


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


questionmark.gif A z czego taki wniosek?
Go to the top of the page
+Quote Post
MTF
post 25.02.2010, 18:43:09
Post #10





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 25.02.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Mchl
post 25.02.2010, 18:58:35
Post #11





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
MTF
post 25.02.2010, 19:07:50
Post #12





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 25.02.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Mchl
post 25.02.2010, 19:14:15
Post #13





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


Problem się zacznie, jak chcąc wyszukać 'olałem' ktoś wpisze 'olalem' tongue.gif
Go to the top of the page
+Quote Post
MTF
post 25.02.2010, 19:15:17
Post #14





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 25.02.2010

Ostrzeżenie: (0%)
-----


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

Ten post edytował MTF 25.02.2010, 19:15:53
Go to the top of the page
+Quote Post
Mchl
post 25.02.2010, 19:20:54
Post #15





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


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'
Go to the top of the page
+Quote Post
MTF
post 25.02.2010, 19:28:59
Post #16





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 25.02.2010

Ostrzeżenie: (0%)
-----


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?

Ten post edytował MTF 25.02.2010, 19:30:04
Go to the top of the page
+Quote Post
Mchl
post 25.02.2010, 19:32:49
Post #17





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


Pomijając SQL injection?

Tylko taki, że niestety będzie to wolniejsze niż gdyby zajął się tym sam MySQL.
Go to the top of the page
+Quote Post
MTF
post 25.02.2010, 19:40:37
Post #18





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 25.02.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
-mkdes-
post 1.03.2010, 20:42:26
Post #19





Goście







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
Go to the top of the page
+Quote Post
Riklaunim
post 2.03.2010, 01:32:31
Post #20





Grupa: Zarejestrowani
Postów: 640
Pomógł: 44
Dołączył: 8.02.2004

Ostrzeżenie: (0%)
-----


A dlaczego wpisując "l" ma szukać także "ł" ? trochę nietypowe zachowanie wyszukiwarki, która zamiast "łaski" znajdzie "laski" winksmiley.jpg


--------------------
Biblioteki: Skrypty, CMS | Kurs PHP | Python
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.05.2025 - 05:58