Vous pouvez utiliser COLLATE NOCASE
dans votre SELECT
requête:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
De plus, dans SQLite, vous pouvez indiquer qu'une colonne doit être insensible à la casse lorsque vous créez la table en spécifiant collate nocase
dans la définition de colonne (les autres options sont binary
(par défaut) et rtrim
; voir ici ). Vous pouvez également spécifier collate nocase
quand vous créez un index. Par exemple:
créer un test de table
(
Text_Value text collate nocase
);
insérer dans les valeurs de test («A»);
insérer dans les valeurs de test («b»);
insérer dans les valeurs de test («C»);
créer un index Test_Text_Value_Index
sur Test (Text_Value collate nocase);
Les expressions impliquant Test.Text_Value
doivent désormais être insensibles à la casse. Par exemple:
sqlite> sélectionnez Text_Value dans Test où Text_Value = 'B';
Text_Value
----------------
b
sqlite> sélectionnez Text_Value dans Test order by Text_Value;
Text_Value
----------------
UNE
b
C
sqlite> sélectionnez Text_Value dans Test order by Text_Value desc;
Text_Value
----------------
C
b
UNE
L'optimiseur peut également potentiellement utiliser l'index pour la recherche et la correspondance insensibles à la casse sur la colonne. Vous pouvez le vérifier en utilisant la explain
commande SQL, par exemple:
sqlite> expliquer sélectionner Text_Value dans Test où Text_Value = 'b';
addr opcode p1 p2 p3
---------------- -------------- ---------- ---------- ---------------------------------
0 Aller 0 16
1 Entier 0 0
2 OpenRead 1 3 keyinfo (1, NOCASE)
3 SetNumColumns 1 2
4 cordes8 0 0 b
5 IsNull -1 14
6 MakeRecord 1 0 a
7 MemStore 0 0
8 MoveGe 1 14
9 MemLoad 0 0
10 IdxGE 1 14 +
11 Colonne 1 0
12 Rappel 1 0
13 Suivant 1 9
14 Fermer 1 0
15 Arrêt 0 0
16 Transaction 0 0
17 VerifyCookie 0 4
18 Goto 0 1
19 Noop 0 0
COLLATE NOCASE
à l'index n'est pas requis si le champ lui-même a déjà ce classement défini: " La séquence de classement par défaut est la séquence de classement définie pour cette colonne dans l'instruction CREATE TABLE. "COLLATE NOCASE
ne fonctionnera qu'avec du texte ASCII. Une fois que vous avez "FIANCÉ" ou "voilà" dans vos valeurs de colonne, il ne correspondra pas à "fiancé" ou "VOILA". Après avoir activé l'extension ICU,LIKE
devient insensible à la casse ,'FIANCÉ' LIKE 'fiancé'
c'est vrai, mais'VOILA' LIKE 'voilà'
toujours faux. Et ICU + LIKE a l'inconvénient de ne pas utiliser l'index, il peut donc être lent sur les grandes tables.select * from tbl where firstname='john' and lastname='doe' COLLATE NOCASE
sera insensible à la casselastname
. Pour être insensible à la casse surfirstname
, écrire ceci:select * from tbl where firstname='john' COLLATE NOCASE and lastname='doe'
. C'est spécifique à cette colonne, pas à lawhere
clause entière .