Pourquoi est-Latin1_General_CS_AS pas sensible à la casse?
Pour LIKE
des requêtes, le Latin1_General_CS_AS classement n'est pas sensible à la casse. Selon un rapport de bug de Microsoft, cela a été répertorié comme "By Design".
Cependant, la Latin1_General_Bin classement est également sensible à la casse et fonctionne exactement comme prévu pour LIKE
requêtes.
Vous pouvez voir la différence dans cette requête simple:
SELECT
MyColumn AS Latin1_General_Bin
FROM MyTable
WHERE MyColumn LIKE '%[a-z]%' COLLATE Latin1_General_Bin;
SELECT
MyColumn AS Latin1_General_CS_AS
FROM MyTable
WHERE MyColumn LIKE '%[a-z]%' COLLATE Latin1_General_CS_AS;
Mes questions sont:
- Pourquoi cela serait-il considéré comme "By Design" pour être sensible à la casse dans
LIKE
? - Si c'est vraiment mieux, pourquoi est-il une différence de comportement entre les deux sensibles à la casse classements _Bin et _CS_AS?
J'allais à normaliser sur Latin1_General_CS_AS pour tous les cas des bases de données sensibles à l'avenir, mais cela semble être un subtil requête bug en attente de se produire.
- Je ne suis pas sûr que cela signifie que
Latin1_General_CS_AS
n'est pas sensible à la casse. La modification de la requête avecLIKE '%[abcdefghijklmnopqrstuvwxyz]%' COLLATE Latin1_General_CS_AS;
semble fonctionner. Le problème semble être la façon dont l'%[a-z]%
est de choisir les personnages - Pour la même raison que ce dba.stackexchange.com/a/34731. Elle est bien documentée et par la conception. La gamme correspond à l'ordre de tri des classements. Vous pouvez imaginer qu'il recherche dans un index avec la colonne de la clé au début de la plage et à la suite de l'index jusqu'à la fin de la plage de retourner les choses en route.
- cela semble être une gamme de "problème"... si vous utilisez
LIKE '%e%'
ouLIKE 'e'
(suggéré dans le rapport de bug), vous obtenez le exprected résultat (aucun), maisLIKE '%[d-f]%'
retourne le mauvais résultat (oui) - Merci pour le lien. J'ai pensé que ce serait quelque chose comme ça à partir de l'élément de connexion.
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas une expression régulière. La gamme
[a-z]
signifie simplement>='a' AND <='z'
.En vertu de ce classement qui comprend toutes les lettres, sauf en capital
Z
.Sous
SQL_Latin1_General_CP1_CS_AS
tous à l'exception de la capitaleA
relèvent que l'ordre de tri.Dans le cas où cela n'est pas encore clair en revue les ordres de tri pour les suivants, pour les trois différents classements
Vous voyez que le classement binaire a toutes les lettres majuscules ensemble, les deux autres ne le font pas.
Ceci est documenté dans le BOL