Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [polskie znaki] wyszukiwanie
Forum PHP.pl > Forum > Bazy danych > MySQL
flashdev
W jaki sposób implementuje się wyszukiwanie w bazie danych zawierającej polskie znaki, dysponując w zapytaniu ciągiem bez polskich znaków?

Czy można zbudować zapytanie tak, aby każdy porównywany ciąg był uprzednio przetworzony przez dowolną funkcję w php.
Czy może są gotowe funkcje w MySql działające w poniższy sposób:
  1. <?php
  2. function bezPolskich($str){
  3. $str = str_replace('ą', 'a', $str);
  4. $str = str_replace('ę', 'e', $str);
  5. ...
  6. return $str;
  7. }
  8. ?>
erix
Cytat
Czy można zbudować zapytanie tak, aby każdy porównywany ciąg był uprzednio przetworzony przez dowolną funkcję w php.

SOUNDEX.
flashdev
To może inaczej. Wymyśliłem sposób na rozwiązanie problemu, ale nie wiem czy jest wystarczająco dobry (szybki).

Powiedzmy, że w bazie danych mam słowo "słownik", którego użytkownik szuka.

wpisuje do wyszukiwarki: "slownik"

W skrypcie php odpowiednia funkcja zamienia mi "l" -> "(l|ł)", i dodaje odpowiednie znaki, jak poniżej:
^(s|ś)(l|ł)(o|ó)w(n|ń)ik$

Następnie wykonuje zapytanie REGEXP i wszyscy są zadowoleni, bo użytkownik znalazł to czego szukał smile.gif


Niestety to rozwiązanie jest dużo wolniejsze od zwykłego zapytania ze znakiem przyrównania.
Ale być może jest najlepsze?
Proszę o jakieś sugestie na ten temat bardziej doświadczonych programistów, zanim zaimplementuje to rozwiązanie w swoim skrypcie.

Edit:

Dodam funkcję, którą napisałem na własne potrzeby na wypadek, gdyby pomysł komuś się spodobał:
  1. function makeRegExpPl($str){
  2. $old = array('e', 'o', 'a', 's', 'l', 'z', 'c', 'n', 'E', 'O', 'A', 'S', 'L', 'Z', 'C', 'N');
  3. $new = array('(e|ę)', '(o|ó)', '(a|ą)', '(s|ś)', '(l|ł)', '(z|ż|ź)', '(c|ć)', '(n|ń)', '(E|Ę)', '(O|Ó)', '(A|Ą)', '(S|Ś)', '(L|Ł)', '(Z|Ż|Ź)', '(C|Ć)', '(N|Ń)');
  4. return '^'.str_replace($old, $new, $str).'$';
  5. }


Oczywiście mile widziane sugestie, gdyby coś dało się zoptymalizować.
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.