Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Porównywanie nie działa jeśli we frazie jest Ł
Forum PHP.pl > Forum > Bazy danych > MySQL
Bartek91
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
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
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
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
Szklana kula mówi, że masz błąd w zapytaniu. Niestety treść zapytania pokazuje niewyraźnie i nie można dostrzec błędu.
Bartek91
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
A możesz mi powiedzieć dlaczego niby Ł miałoby być równe L ?
mmmmmmm
Z tego samego powodu, dla którego 'ó'='o', a 'ź'='z'
Bartek91
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 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ąć smile.gif
by_ikar
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.