Jedną z bardzo przydatnych funkcji języka SQL, szczególnie w dialekcie MySQL, jest możliwość umieszczenia wyrażenia regularnego w klauzuli WHERE, przez co można w bardzo wygodny sposób ograniczyć zbiór rekordów, na którym operuje dane zapytanie. Jest to bardzo przydatne w przypadku pól tekstowych, gdzie mamy bardzo ograniczone pole manewru w kwestii porównywania tego typu wartości. Nie każdy jednak wie, że operator REGEXP domyślnie nie uwzględnia wielkości liter porównywanych ciągów znaków. W niniejszym wpisie chciałbym przedstawić Wam krótką poradę dotyczącą naprawy tego niedociągnięcia.

Modyfikator BINARY.

Aby zmusić operator REGEXP do porównywania pól tekstowych z uwzględnieniem wielkości liter, należy do zapytania wprowadzić modyfikator BINARY, a więc cały operator będzie brzmiał: REGEXP BINARY. Przykładowe zapytanie wykonane do bazy danych blogu:

SELECT *
FROM wp_posts
WHERE post_title REGEXP '[^a-zA-Z]sql[^a-zA-Z]';

Pomimo braku wpisów, w których tytułach użyłbym nazwy “SQL” pisanej małymi literami, zwróciło kilka rekordów zawierających ten fragment.

Zamieniamy je więc na następujące - dodajemy modyfikator BINARY:

SELECT *
FROM wp_posts
WHERE post_title REGEXP BINARY '[^a-zA-Z]sql[^a-zA-Z]';

I cieszymy się porównywaniem case-sensitive - zapytanie zgodnie z oczekiwaniami nie zwróciło żadnych rekordów.

Przykład ten być może jest mało “ciekawy”, z punktu widzenia kogoś szukającego gotowego zapytania do skopiowania, ale dobrze pokazuje ideę działania samego mechanizmu. Mam nadzieję, że taka krótka porada przyda Wam się w pracy, jako, że nie znalazłem w Internecie wielu źródeł, które w taki “szybki” i przystępny sposób opisywałyby powyższe “zjawisko”

Do zobaczenia w kolejnym wpisie!