VegetaSSJ
22.04.2008, 11:26:59
Witam!
Koledzy mam problem. Chciałem zrobić pobieranie artykułów z bazy danych na podstawie tytułu, tzn powiedzmy takim urlem:
domena.pl/artykuly/czytaj/tytul,zytnia_mocna . Mam tabelę w której są mni pola:
id - auto_inc pr_key, title - unique.
Problem jest taki że w tabeli w polu title mogą być polskie znaki, ponieważ pole to używane jest również do listowania artykułów. W url ze względu na zgodność z przeglądarkami a gównie IE nie mogę przesyłać polskich znaków, tzn muszę je zastępować przez odpowiedniki ó - o, ż - z, itd. Czyli w skrypcie mam tytuł zytnia_mocna a w bazie żytnia_mocna. Jak teraz wykonać SELECTA żeby pobrał wyniki z dopasowania tytułów ? Wiem że jest funkcja REPLACE, mogę wykonać takie zapytanie, SELECT id, title FROM artykuly WHERE REPLACE(title, 'ż', 'z') = 'żytnia mocna' ale problem w tym że to działa tylko dla jednej litery. W php jest funkcja str_replace w której jako argumenty można podać tablice znaków np str_replace('zytnia_mocna', array('ż','ó', ...), array('z', 'o', ...)) ale jak to zrobić w SQL. Jeżeli jakaś tęga głowa ma pomysł jak rozwiązać mój problem bardzo proszę o pomoc.
Sam osobiście wpadłem na taki pomysł że dodam do tabeli jeszcze jedną kolumnę z kluczem do porównywania tzn będzie
title - żytnia_mocna, key - zytnia_mocna, ale może jest na to innt sposób ?
ayeo
22.04.2008, 11:33:23
Twój sposób jest ok. Możesz też za pomocą str_replace(); przerobić stringa i dopiero wstawić do w zapytanie sql.

Pozdrawiam!
VegetaSSJ
22.04.2008, 11:41:44
kolego nie zrozumiałeś ja mam w skrypcie string już bez polskich znaków a w bazie z polskimi.
ayeo
22.04.2008, 11:48:24
Rzeczywiście, sorry! Trochę nie zrozumiałem problemu. Wybacz.
Jeśli tak to nie odwrócisz stringa bez polskich znaków na stringa z polskimi

Musiałbyś używać słownika, a i to nie daje 100% poprawności. Twój sposób z dodatkową kolumną w tabeli jest ok. Jest nawet zgodny z zasadami normalizacji baz danych

Pozdrawiam!
nevt
22.04.2008, 11:58:14
jeżeli w bazie masz kodowanie UTF-8 to:
SELECT * FROM tabela WHERE pole = 'zytnia_wodka' COLLATE utf8_general_ci;
wyszuka ci ignorując polskie znaki, z kolei
SELECT * FROM tabela WHERE pole = 'żytnia_wódka' COLLATE utf8_polish_ci;
dopasuje tylko jeśli nasze ogonki będą się zgadzać ...
tdzierza
23.02.2009, 00:08:45
Witam.
Przepraszam że odkopuje taki stary temat, ale chce potwierdzić prawdziwość ostatniego posta.
Przeprowadziłem podobne próby i nie działa mi to.
Gdy załóżmy w bazie mamy słowo żytnia_wódka,
to odnalezienie jest możliwe tylko po wpisaniu dokładnie tego słowa, nie ignoruje w żadnym wypadku polskich znaków
wookieb
23.02.2009, 01:07:29
A jakie masz kodowanie danego pola, tabeli, bazy danych?
tdzierza
23.02.2009, 10:37:53
kodowanie mam ustawione na: utf8
a metodę porównania napisów: utf8_general_ci