Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrażenia regularne a polskie znaki diakrytyczne
Forum PHP.pl > Forum > Bazy danych > MySQL
molek
Witam

Posiadam baze, która w tabeli haslo przechowuje kilkadziesiąt tysięcy słów.
Tabela haslo składa się z trzech kolumn:
id
slowo
dlugosc_slowa

Z wykorzystaniem wyrażeń regularnych chciałbym np. wyszukać losowe czteroliterowe słowo zaczynające się na literę 'l'
robię to za pomocą zapytania:

Kod
SELECT * FROM haslo
WHERE slowo REGEXP '[l]...$' and dlugosc_slowa = 4 ORDER BY RAND( ) LIMIT 1


Zapytanie zwraca poprawne rezultaty (np. lada, list) dopóki nie napotka na polskie znaki,
jeśli w sprawdzanym słowie napotka na polski ogonek to potrafi zwrócić np. zlać lub pląs - wyrazy czteroliterowe ale nie zaczynające się na litere 'l'

kodowanie utf8
metoda porównywania napisów to utf8_polish_ci

Jak sobie z tym poradzić?
Z góry dziękuje za pomoc.


Crozin
A po co Ci wyrażenia regularne tutaj w ogóle?
  1. WHERE LEFT(slowo, 1) = 'l' AND dlugosc_slowa = 4
molek
Fajny sposób ale co w przypadku kiedy chce wyszukać sześcioliterowe słowo gdzie wiem, że:
pierwsza litera to 'k' trzecia to 'a' i szósta to 'ć'
[k].[a]..[ć] (kłamać)
Crozin
Przy pomocy SUBSTRING() możesz wyciąć sobie pojedynczy znak z tekstu i go porównać (czyli w tym przypadku konieczne byłoby trzykrotne wykorzystanie tej funkcji). W dodatku funkcja ta jest multi-byte safe czyli nie będzie problemu z UTF-8.

Problemem REGEXP jest to:
Cytat
Warning

The REGEXP and RLIKE operators work in byte-wise fashion, so they are not multi-byte safe and may produce unexpected results with multi-byte character sets. In addition, these operators compare characters by their byte values and accented characters may not compare as equal even if a given collation treats them as equal.
kitol
Spróbuj również:
  1. SELECT ... WHERE slowo LIKE 'k_a__ć'


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.