Bartek91
20.07.2014, 21:24:48
Posiadam tabelę z miastami w bazie i wyszukiwarkę, w którą wpisuje się miasto.
Baza zwraca 0 rekordów jeśli wpisze się "Lodz" lub "Wroclaw".
Działa dobrze na przykład dla takich zapytań: "Łódź", "Wrocław", "Łodz", "łodz", "Poznań", "Kraków".
Szukałem sporo w google, ale znalazłem tylko przypadki, gdzie nie działały w ogóle polskie znaki. Pisali o zmianie porównywania napisów i kodowaniu.
Również próbowałem wielu różnych kodowań, ale nic nie pomogło.
Macie jakiś pomysł, dlaczego akurat Ł z polskich znaków nie działa poprawie, a pozostałe tak?
Pyton_000
20.07.2014, 21:35:37
Zdecyduj się, w końcu działa dla Ł czy nie bo z posta wynika że działa.
Jakie kodowanie znaków dla bazy, tabeli, pola
kartin
20.07.2014, 21:35:49
Czyli w bazie masz np. Wrocław i ma go znaleźć niezależnie jakiej wielkości liter użyjesz w wyszukiwaniu i czy użyjesz polskich znaków czy nie?
Jak masz teraz zrobione wyszukiwanie?
Bartek91
20.07.2014, 21:58:17
Może źle się wyraziłem na początku:
Jak w bazie jest "Ł" i porównujemy je z "ł" lub "Ł" to zwraca rekord. Nie zwraca natomiast jeśli porównamy z "L" lub "l".
W bazie, tabeli i polu jest kodowanie utf8_polish_ci.
Mam pole wyszukiwarki i w php wywołuję zapytanie ze zmienną z inputa i zwracam w json wyniki. Ale to nie ma chyba znaczenia, bo w phpmyadmin jak wpiszę pojedyncze zapytanie w sql to też nie zwraca.
kartin
20.07.2014, 22:14:11
Szklana kula mówi, że masz błąd w zapytaniu. Niestety treść zapytania pokazuje niewyraźnie i nie można dostrzec błędu.
Bartek91
20.07.2014, 22:29:05
Zapytanie:
SELECT * FROM `places` WHERE `address` = 'lodz';
MySQL zwrócił pusty wynik (zero wierszy).
a zapytanie:
SELECT * FROM `places` WHERE `address` = 'łodz';
Zwraca wyniki
W bazie w polu address jest dokładnie "Łódź".
Pyton_000
21.07.2014, 06:31:58
A możesz mi powiedzieć dlaczego niby Ł miałoby być równe L ?
mmmmmmm
21.07.2014, 07:25:37
Z tego samego powodu, dla którego 'ó'='o', a 'ź'='z'
Bartek91
21.07.2014, 11:53:47
No właśnie, dlaczego ó = o, a ł =/ l ?
Jak w takich przypadkach pomija się polskie znaki i wyszukuje rekordy?
Na tym samym serwerze mam również inną stronę i tam działa dobrze wyszukiwanie bez polskich znaków
Tylko, że nie pamiętam dokładnie jak wtedy robiłem, ale tam są w bazie wpisy w postaci: "WrocÅ‚aw" a teraz, gdzie nie działa "Wrocław".
Pomógł sposób opisany na stronie:
http://trzebinski.info/wyszukiwanie-fraz-z...yciu-php-mysql/Po prostu pomijam polskie znaki i dopiero je porównuję.
Temat można zamknąć
by_ikar
21.07.2014, 12:33:56
Mysql nie jest "wrażliwy" na wielkość liter out of box. Czyli normalnie rzutuje wszystkie wyniki do małych liter (bez względu na kodowanie) i dopiero wtedy porównuje. Aby temu zapobiec trzeba użyć porównania binarnego:
Kod
SELECT * FROM `places` WHERE BINARY `address` = 'Łodz';
A to że gdzieś ci wyszukiwało zarówno po "l" jak i po "ł", to raczej jest nie możliwe i najprawdopodobniej ci się to przywidziało. Bo gdyby było inaczej, to ludzie nie dwoili i troili by się nad stworzeniem specjalnych mechanizmów (morfologia, pary etc) i słowników. Także to co chcesz osiągnąć nie jest dostępne w łatwy sposób. Najłatwiej i najbiedniej jest to zrobić na zasadzie stworzenia dodatkowej kolumny, tzn dla odpowiednika bez znaków diakrytycznych (ogonków). I wtedy przy zapytaniu dodajesz OR i przerabiasz taki wyraz na bez polskich znaków. Kolejnym sposobem jest stworzenie swojej listy miast i "podpowiadanie" użytkownikowi podczas pisania listy miast z podobnymi znakami. Dzięki czemu mógłbyś reagować od razu na to co użytkownik wpisuje i nie musiałbyś stosować magi po stronie serwera podczas wyszukiwania.
A jeżeli koniecznie chcesz swój magię - cóż, wszelkiej maści luence, sphinx i tym podobne stoją otworem.
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.