Domyślnie SQLite LIKE
operator nie rozróżnia wielkości liter dla znaków ASCII. Oznacza to, że będzie pasował do wielkich i małych liter, niezależnie od tego, jakiej wielkości użyjesz we wzorze.
Istnieje jednak technika, dzięki której rozróżniana jest wielkość liter.
SQLite ma instrukcję PRAGMA o nazwie case_ sensitive_like , który został zaprojektowany specjalnie po to, aby LIKE
operator rozróżnia wielkość liter dla znaków ASCII.
Powodem, dla którego określam „znaki ASCII” jest to, że LIKE
operator domyślnie rozróżnia wielkość liter dla znaków Unicode, które są poza zakresem ASCII.
Dlatego jeśli potrzebujesz LIKE
operator rozróżniający wielkość liter w zakresie ASCII, case_ sensitive_like Oświadczenie PRAGMA może być tym, czego szukasz.
Dotyczy to również funkcji like()
funkcja, która działa dokładnie tak samo jak funkcja LIKE
operatora.
Włączanie/wyłączanie rozróżniania wielkości liter
Aby włączyć rozróżnianie wielkości liter, możesz użyć dowolnej z następujących wartości logicznych:
1
on
true
yes
Aby wyłączyć rozróżnianie wielkości liter, możesz użyć dowolnej z następujących wartości logicznych:
0
off
false
no
Argument może być umieszczony w nawiasach lub może być oddzielony od nazwy pragmy znakiem równości.
Argumenty słów kluczowych mogą opcjonalnie pojawiać się w cudzysłowie.
Przykład bez uwzględniania wielkości liter
Najpierw zobaczmy, co się dzieje, gdy nie używamy case_ sensitive_like Oświadczenie PRAGMA.
SELECT
'a' LIKE 'A',
'æ' LIKE 'Æ';
Wynik:
'a' LIKE 'A' 'æ' LIKE 'Æ' ------------ ------------ 1 0
W takim przypadku w pierwszej kolumnie nie jest rozróżniana wielkość liter – wielkie litery A pasuje do małej litery a .
A oto zapytanie do tabeli bazy danych.
SELECT
CatName,
CatName LIKE 'br%'
FROM Cats;
Wynik:
CatName CatName LIKE 'br%' ---------- ------------------ Brush 1 Brash 1 Broosh 1 100%Fluff 0 100$Fluff 0
W tym przypadku otrzymujemy dopasowanie do wszystkich kotów, których imiona zaczynają się od Br , mimo że nasze kryteria używały małej litery b .
Przykład uwzględniający wielkość liter
Zobaczmy teraz, co się stanie, gdy użyjemy case_ sensitive_like Oświadczenie PRAGMA umożliwiające rozróżnianie wielkości liter w zakresie ASCII.
PRAGMA case_sensitive_like = 1;
SELECT
'a' LIKE 'A',
'æ' LIKE 'Æ';
Wynik:
'a' LIKE 'A' 'æ' LIKE 'Æ' ------------ ------------ 0 0
Więc tym razem wielkie A czy nie dopasuj małe litery a .
A oto przykład bazy danych po włączeniu rozróżniania wielkości liter.
SELECT
CatName,
CatName LIKE 'br%'
FROM Cats;
Wynik:
CatName CatName LIKE 'br%' ---------- ------------------ Brush 0 Brash 0 Broosh 0 100%Fluff 0 100$Fluff 0
Zauważ, że nie musiałem ponownie uruchamiać instrukcji PRAGMA. Ustawienie pozostaje dla mojego połączenia, dopóki go nie zmienię.
Wyłącz rozróżnianie wielkości liter
Oto przykład wyłączenia rozróżniania wielkości liter i ponownego uruchomienia zapytania.
PRAGMA case_sensitive_like = 0;
SELECT
CatName,
CatName LIKE 'br%'
FROM Cats;
Wynik:
CatName CatName LIKE 'br%' ---------- ------------------ Brush 1 Brash 1 Broosh 1 100%Fluff 0 100$Fluff 0
Funkcja Like()
Jak wspomniano, case_ sensitive_like Instrukcja PRAGMA wpływa również na like()
funkcja.
PRAGMA case_sensitive_like = 1;
SELECT
CatName,
like('Br%', CatName),
like('br%', CatName)
FROM Cats;
Wynik:
CatName like('Br%', CatName) like('br%', CatName) ---------- -------------------- -------------------- Brush 1 0 Brash 1 0 Broosh 1 0 100%Fluff 0 0 100$Fluff 0 0
Operator LIKE obsługujący Unicode
Możesz również użyć rozszerzenia SQLite ICU, jeśli potrzebujesz obsługi Unicode LIKE
operator.
Implementacja LIKE
zawarte w tym rozszerzeniu używa funkcji ICU u_foldCase()
aby zapewnić porównania niezależne od wielkości liter dla pełnego zakresu znaków Unicode.