Dans la documentation sur l'opérateur LIKE , rien n'est dit sur sa sensibilité à la casse. C'est ça? Comment l'activer / le désactiver?
J'interroge des varchar(n)
colonnes, sur une installation de Microsoft SQL Server 2005, si cela compte.
sql
sql-server-2005
varchar
sql-like
Marcel
la source
la source
LIKE
est sensible à la casse, si ce n'est pas le cas, alorsLIKE
ne l'est pasRéponses:
Ce n'est pas l'opérateur qui est sensible à la casse, c'est la colonne elle-même.
Lorsqu'une installation SQL Server est effectuée, un classement par défaut est choisi pour l'instance. Sauf indication contraire explicite (vérifiez la clause collate ci-dessous) lorsqu'une nouvelle base de données est créée, elle hérite du classement de l'instance et lorsqu'une nouvelle colonne est créée, elle hérite du classement de la base de données à laquelle elle appartient.
Un classement comme
sql_latin1_general_cp1_ci_as
dicte la façon dont le contenu de la colonne doit être traité. CI signifie insensible à la casse et AS signifie sensible aux accents.Une liste complète des classements est disponible à l' adresse https://msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx
(a) Pour vérifier un classement d'instances
(b) Pour vérifier un classement de base de données
(c) Pour créer une base de données en utilisant un classement différent
(d) Pour créer une colonne en utilisant un classement différent
(e) Pour modifier un classement de colonnes
Il est possible de modifier une instance et des classements de base de données, mais cela n'affecte pas les objets créés précédemment.
Il est également possible de modifier un classement de colonnes à la volée pour la comparaison de chaînes, mais cela est fortement déconseillé dans un environnement de production car cela est extrêmement coûteux.
la source
[A-Z]
est toujours insensible à la casse.[ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]
semble cependant obéir à la collation.select COLLATION_NAME, iif(cast(COLLATIONPROPERTY(COLLATION_NAME, 'ComparisonStyle') as int) & 1 = 0, 'case sensitive', 'case insensitive') from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'exampletable' and COLUMN_NAME = 'examplecolumn'
Tous ces discours sur le classement semblent un peu trop compliqués. Pourquoi ne pas simplement utiliser quelque chose comme:
Alors votre chèque est insensible à la casse quel que soit le classement
la source
like 'a%'
pourrait utiliser l'index et laupper
version ne le pouvait pas.like
opérateur est sensible à la casse ou non .Latin1_General_CI_AS
, alors faireUPPER(@@VALUE) NOT LIKE '%SOMETHING%'
ou@@COLUMN NOT LIKE '%SOMETHING%'
n'est pas pertinent: le résultat serait le même.Vous avez la possibilité de définir l' ordre de classement au moment de la définition de votre table. Si vous définissez un ordre sensible à la casse, votre
LIKE
opérateur se comportera de manière sensible à la casse; si vous définissez un ordre de classement insensible à la casse, l'LIKE
opérateur ignorera également la casse des caractères:Voici une démo rapide sur sqlfiddle montrant les résultats de l'ordre de classement sur les recherches avec
LIKE
.la source
Si vous souhaitez effectuer une recherche sensible à la casse sans changer le classement de la colonne / base de données / serveur, vous pouvez toujours utiliser la
COLLATE
clause, par exempleFonctionne également dans l'autre sens, si votre colonne / base de données / serveur est sensible à la casse et que vous ne voulez pas une recherche sensible à la casse, par exemple
la source
WHERE bar COLLATE Latin1_General_CS_AS LIKE '[j-k]%'
elle retourneraJohn
car dans ce classement, les majusculesJ
se trouvent entre minusculesj
et minusculesk
. C'est commeaAbBcC...jJkKlLmM...
ce qui n'est pas évident. Cela sembleLatin1_General_BIN
plus prévisible avec les recherches par plage avec l'opérateur LIKE.L'
like
opérateur prend deux chaînes. Ces chaînes doivent avoir des classements compatibles, ce qui est expliqué ici .À mon avis, les choses se compliquent alors. La requête suivante renvoie une erreur indiquant que les classements sont incompatibles:
Sur une machine aléatoire ici, le classement par défaut est
SQL_Latin1_General_CP1_CI_AS
. La requête suivante réussit, mais ne renvoie aucune ligne:Les valeurs "abc" et "ABC" ne correspondent pas dans un monde sensible à la casse.
En d'autres termes, il y a une différence entre ne pas avoir de classement et utiliser le classement par défaut. Lorsqu'un côté n'a pas de classement, alors il est "assigné" un classement explicite de l'autre côté.
(Les résultats sont les mêmes lorsque le classement explicite est à gauche.)
la source
Essayez de courir,
Vérifiez ensuite si votre classement est sensible à la casse ou non.
la source
Vous pouvez modifier la propriété de chaque élément.
la source
Vous pouvez facilement modifier le classement dans Microsoft SQL Server Management Studio.
la source