Som standard är SQLite LIKE
operatorn är skiftlägeskänslig för ASCII-tecken. Det betyder att den matchar versaler och gemener, oavsett vilket skiftläge du använder i ditt mönster.
Det finns dock en teknik du kan använda för att göra den skiftlägeskänslig.
SQLite har en PRAGMA-sats som heter casesensitive_like , som är utformad för att specifikt göra LIKE
operatör skiftlägeskänslig för ASCII-tecken.
Anledningen till att jag anger "ASCII-tecken" är att LIKE
operatorn är skiftlägeskänslig som standard för unicode-tecken som ligger utanför ASCII-intervallet.
Därför, om du behöver LIKE
operatorn ska vara skiftlägeskänslig i ASCII-intervallet, case_sensitive_like PRAGMA-uttalande kan vara det du letar efter.
Detta gäller även för like()
funktion, som fungerar exakt på samma sätt som LIKE
operatör.
Aktivera/inaktivera skiftlägeskänslighet
Du kan använda något av följande booleska värden för att aktivera skiftlägeskänslighet:
1
on
true
yes
Du kan använda något av följande booleska värden för att inaktivera skiftlägeskänslighet:
0
off
false
no
Argumentet kan vara antingen inom parentes eller så kan det separeras från pragmans namn med ett likhetstecken.
Nyckelordsargument kan valfritt visas inom citattecken.
skiftlägeskänsligt exempel
Låt oss först se vad som händer när vi inte använder case_sensitive_like PRAGMA uttalande.
SELECT
'a' LIKE 'A',
'æ' LIKE 'Æ';
Resultat:
'a' LIKE 'A' 'æ' LIKE 'Æ' ------------ ------------ 1 0
I det här fallet är den första kolumnen skiftlägesokänslig – versalerna A matchar gemener a .
Och här är en fråga mot en databastabell.
SELECT
CatName,
CatName LIKE 'br%'
FROM Cats;
Resultat:
CatName CatName LIKE 'br%' ---------- ------------------ Brush 1 Brash 1 Broosh 1 100%Fluff 0 100$Fluff 0
I det här fallet får vi en match mot alla katter vars namn börjar på Br , även om våra kriterier använde en liten b .
Skaftkänsligt exempel
Låt oss nu se vad som händer när vi använder case_sensitive_like PRAGMA-sats för att möjliggöra skiftlägeskänslighet i ASCII-intervallet.
PRAGMA case_sensitive_like = 1;
SELECT
'a' LIKE 'A',
'æ' LIKE 'Æ';
Resultat:
'a' LIKE 'A' 'æ' LIKE 'Æ' ------------ ------------ 0 0
Så den här gången versaler A gör inte matcha gemener a .
Och här är databasexemplet efter att ha aktiverat skiftlägeskänslighet.
SELECT
CatName,
CatName LIKE 'br%'
FROM Cats;
Resultat:
CatName CatName LIKE 'br%' ---------- ------------------ Brush 0 Brash 0 Broosh 0 100%Fluff 0 100$Fluff 0
Lägg märke till att jag inte behövde köra PRAGMA-satsen igen. Inställningen förblir på plats för min anslutning tills jag ändrar den.
Inaktivera skiftlägeskänslighet
Här är ett exempel på hur du inaktiverar skiftlägeskänslighet och kör frågan igen.
PRAGMA case_sensitive_like = 0;
SELECT
CatName,
CatName LIKE 'br%'
FROM Cats;
Resultat:
CatName CatName LIKE 'br%' ---------- ------------------ Brush 1 Brash 1 Broosh 1 100%Fluff 0 100$Fluff 0
Like()-funktionen
Som nämnts, case_sensitive_like PRAGMA-satsen påverkar också like()
funktion.
PRAGMA case_sensitive_like = 1;
SELECT
CatName,
like('Br%', CatName),
like('br%', CatName)
FROM Cats;
Resultat:
CatName like('Br%', CatName) like('br%', CatName) ---------- -------------------- -------------------- Brush 1 0 Brash 1 0 Broosh 1 0 100%Fluff 0 0 100$Fluff 0 0
Unicode-Aware LIKE-operatör
Du kan också använda SQLite ICU-tillägget om du behöver en unicode-medveten LIKE
operatör.
Implementeringen av LIKE
som ingår i detta tillägg använder ICU-funktionen u_foldCase()
för att tillhandahålla kasusoberoende jämförelser för hela utbudet av unicode-tecken.