![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 22.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
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? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 246 Pomógł: 79 Dołączył: 25.05.2010 Ostrzeżenie: (0%) ![]() ![]() |
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? |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 22.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował Bartek91 20.07.2014, 22:00:36 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 246 Pomógł: 79 Dołączył: 25.05.2010 Ostrzeżenie: (0%) ![]() ![]() |
Szklana kula mówi, że masz błąd w zapytaniu. Niestety treść zapytania pokazuje niewyraźnie i nie można dostrzec błędu.
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 22.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
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ź". |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
A możesz mi powiedzieć dlaczego niby Ł miałoby być równe L ?
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
Z tego samego powodu, dla którego 'ó'='o', a 'ź'='z'
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 22.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
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 (IMG:style_emoticons/default/worriedsmiley.gif) 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ąć (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował by_ikar 21.07.2014, 12:36:19 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 4.10.2025 - 13:27 |