SQL Server : Gestion des minuscules, majuscules et accent dans les chaînes de caractères
A la question : Est-ce que SQL Server traite les chaînes de caractères en ignorant la différence majuscule / minuscule ou pas, que répondriez vous ?
La réponse est très légèrement normande, car cela dépend. De quoi ? Du classement (collation / collate) des chaînes de caractères comparées.
Le classement sert à définir plusieurs éléments :
- Le jeu de caractère utilisé par les champs non unicode (varchar, char et text)
- La manière de trier les chaînes de caractères
- Certaines options de comparaison telles que la sensibilité à la casse, aux accents, à la largeur du caractère, etc.
La casse est justement le sujet qui nous intéresse en termes de différentiation des minuscules et majuscules. Le critère permettant de savoir si notre comparaison est sensible ou non aux minuscules et majuscules est bien le classement.
Prenons le classement par défaut de SQL Server sur une machine installée en Français : French_CI_AS. CI signifie CASE INSENTIVE, le moteur est donc par défaut insensible aux différences entre les minuscules et les majuscules dans les comparaisons des chaînes de caractères, que ce soit avec un « = » ou un « LIKE ». Ainsi les 2 requêtes suivantes devraient renvoyer le même résultat (en fonction des paramètres de votre serveur ou de vos bases de données) :
use AdventureWorks
go
select * from Production.Product
where Color = 'Black'
select * from Production.Product
where Color = 'BLACK'
Or il est possible de changer le classement de la chaîne de caractère, ce qui permet d'influencer la comparaison. Les 2 requêtes suivantes permettront de forcer la différenciation entre les minuscules et majuscules. De ce fait elles reverront des résultats différents :
use AdventureWorks
go
select * from Production.Product
where Color = 'Black' collate French_CS_AS
select * from Production.Product
where Color = 'BLACK' collate French_CS_AS
En ce qui concerne les accents, le comportement est identique, le changement du classement entre AS et CS permettra de prendre en compte ou non l'égalité de ceux-ci avec des caractères non accentués. Par défaut toujours les serveurs sont configurés comme étant sensibles aux accents , les requêtes suivantes renverront des résultats différents :
use AdventureWorks
go
select * from Production.Product
where Color = 'Blâck'
select * from Production.Product
where Color = 'Black'
Le fait de rendre insensible le classement aux accents permettra d'avoir un résultat cette fois identique :
use AdventureWorks
go
select * from Production.Product
where Color = 'Blâck' COLLATE French_CI_AI
select * from Production.Product
where Color = 'Black' COLLATE French_CI_AI
La commande COLLATE est très intéressante quand elle est bien maitrisé pour changer le comportement des comparaisons et prenant en compte les différences de certains caractères. Il faudra tout même faire attention à la présence éventuelle d'un index qui ne sera utilisé en cas d'utilisation d'un classement différend de celui de base de la colonne texte.
J'avais déjà fait un petit exemple de code ici :
http://www.sqlfr.com/codes/SQL-SERVER-COMPARER-CHAINES-CARACTERES-AVEC-SANS-ACCENTS_39041.aspx
Bonne comparaison…
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :