Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ignorowanie polskich znaków w zapytaniu
Forum PHP.pl > Forum > Bazy danych > MySQL
natasha
hej

mam w tabeli 'test' rekordy np.

id | nazwa
1 żółwik


jak napisać select'a żeby wyjać powyższy rekord lecz w warunku żeby było WHERE NAZWA = 'zolwik'

czyli używając wyrazów bez polskich znaków znaleźć w bazie wyrazy z polskimi znakami.

Jest jakaś funkcja w mysql żeby zignorować polskie znaki podczas przeszukiwania bazy questionmark.gif
skowron-line
Cytat(natasha @ 12.01.2010, 13:55:38 ) *
Jest jakaś funkcja w mysql żeby zignorować polskie znaki podczas przeszukiwania bazy questionmark.gif

Tak, nie, prawie nazywa się replace.
natasha
Cytat(skowron-line @ 12.01.2010, 14:24:35 ) *
Tak, nie, prawie nazywa się replace.


replace moze i byłby dobry w odwrotnej sytuacji czyli przy szukaniu słowa z polskimi znakami w bazie gdzie nie ma polskich wyrazów

chodzi mi o to ze nie wiem jak zmodyfikować zapytanie np.

select nazwa from test where nazwa = 'zolw'

...cos w tym stylu - a ma znalezc rekord ktory w nazwie ma żółw (z polskimi znakami)

W GOOGLE NIC SENSOWNEGO NIE MOGE ZNALEZC NA TEN TEMAT edit: a swoją drogą jak ładnie google indeksuje forum.php.pl - juz pojawiło sie w google na 1 pozycji z frazami ktore mnie interesują fiu fiu
webdice
  1. SELECT `field` FROM `table` WHERE `field` = 'zolw' COLLATE utf8_general_ci;


Oczywiście kodowanie sobie dobierz.
natasha
Cytat(webdice @ 12.01.2010, 15:44:15 ) *
  1. SELECT `field` FROM `table` WHERE `field` = 'zolw' COLLATE utf8_general_ci;

Oczywiście kodowanie sobie dobierz.


mam html i baze w utf8 czyli rozumiem ze dodaje
COLLATE utf8_general_ci

jednak to nic nie daje

w jaki sposob powyzsze zapytanie ma spowodowac wyswietlenie rekordu o wartosci field = 'zółw' questionmark.gif probuje ale nic nie daje - dlatego sie pytam

dodam ze nie mam zadnego problemu z kodowaniem na stronie i w bazie - po prostu szukam rozwiazania dla powyzszego problemu


problem podobny jak w http://forum.php.pl/lofiversion/index.php/t92631.html jednak tez bez rozwiazania
Mchl
FULL TEXT search w trybie niebinarnym olewa akcenty
webdice
Pokaż zrzut tabeli i przykładowy rekord.
natasha
Cytat(webdice @ 12.01.2010, 21:43:42 ) *
Pokaż zrzut tabeli i przykładowy rekord.


proszę:


CREATE TABLE IF NOT EXISTS `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nazwa` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;



INSERT INTO `test` (`id`, `nazwa`) VALUES
(1, 'żółw');
flashdev
Cytat(natasha @ 12.01.2010, 13:55:38 ) *
[...]
jak napisać select'a żeby wyjać powyższy rekord lecz w warunku żeby było WHERE NAZWA = 'zolwik'

czyli używając wyrazów bez polskich znaków znaleźć w bazie wyrazy z polskimi znakami.

Jest jakaś funkcja w mysql żeby zignorować polskie znaki podczas przeszukiwania bazy questionmark.gif


  1. function zamien($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. }


Takie coś kiedyś wymyśliłem. Przy wyszukiwaniu trzeba użyć regexp.
Pewnie nie jest to najlepsze rozwiazanie (powolne), ale w moim przypadku wystarczyło.
natasha
jutro sprawdze ... tylko skoro to działa wolno to chyba w moim przypadku to moze nie zdac egzaminu - to ma służyć generowaniu linków czyli bedzie uzywane bardzo czesto


ps. po szybkim spojrzeniu widac ze ten kod tworzy wyrazenie regularne - tylko teraz jak połączyc to z zapytaniem mysql questionmark.gif
flashdev
Cytat(natasha @ 12.01.2010, 23:44:46 ) *
jutro sprawdze ... tylko skoro to działa wolno to chyba w moim przypadku to moze nie zdac egzaminu - to ma służyć generowaniu linków czyli bedzie uzywane bardzo czesto


Chodzi o to, że 'LIKE' jest wolniejsze od '='. Najlepiej sama potestuj czasy.
A póki nie masz lepszego rozwiązania to zaimplementuj takie, bo funkcje masz już gotową winksmiley.jpg
natasha
Cytat(flashdev @ 12.01.2010, 23:47:51 ) *
Chodzi o to, że 'LIKE' jest wolniejsze od '='. Najlepiej sama potestuj czasy.
A póki nie masz lepszego rozwiązania to zaimplementuj takie, bo funkcje masz już gotową winksmiley.jpg


a można użyć like albo = z wyrażeniem regularnym w zapytaniu questionmark.gif myślałam ,że można użyc tylko REGEXP w takiej sytuacji.
flashdev
Cytat(natasha @ 13.01.2010, 09:01:37 ) *
a można użyć like albo = z wyrażeniem regularnym w zapytaniu questionmark.gif myślałam ,że można użyc tylko REGEXP w takiej sytuacji.


Do zapytania regexp musisz użyć wyszukiwania 'REGEXP'. W poprzednim poście myślałem, że do tego jest 'LIKE', ale sam sie wprowadziłem w błąd bo miałem ustawiony inny typ danych w tabeli.
Tak na zdrowy rozsądek 'REGEXP' będzie jeszcze wolniejsze od 'LIKE',a le to już najlepiej sama przetestuj na swojej bazie danych.
W phpmyadmin masz podane czasy wykonywaia dla każdego zapytania sql.
Mruss
A nie jest przypadkiem zbyt dużo możliwości??
Nie lepiej będzie zrobić kolumnę z bezogonkowym odpowiednikiem słowa, które spolszczy słowo przy dodawaniu do tabeli??
sciana.gif
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.