Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

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 :
Publié mercredi 2 juillet 2008 19:57 par christian
Classé sous : ,

Commentaires

jeudi 3 juillet 2008 12:09 by guldan

# re: SQL Server : Gestion des minuscules, majuscules et accent dans les chaînes de caractères

J'utilise parfois la commande COLLATE DATABSE_DEFAULT bien pratique qui cast un champ dans la collation de la base à laquelle il appartient sans avoir à la trouver et à l'écrire...mais en effet, attention aux index...

jeudi 3 juillet 2008 18:18 by christian

# re: SQL Server : Gestion des minuscules, majuscules et accent dans les chaînes de caractères

Ouais, mais pour changer la sensibilité à la casse ou aux accent çà n'aide pas beaucoup le DATABASE_DEFAULT_CI ou DATABASE_DEFAULT_AS n'existant pas...

Ca serait bien d'avoir juste la possibilité d'influancer sur ces 2 là sans remettre le classement c'est sûr !

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Le nouveau Gojira, c’est pour lundi… par CoqBlog le il y a 8 heures et 9 minutes

- SharePoint : nouvel article sur la mise en place des Scopes dans MOSS Searchs par Blog Technique de Romelard Fabrice le il y a 15 heures et 36 minutes

- Hello CS par Le Blog de julz le il y a 21 heures et 2 minutes

- MSDN/TechNet/Microsoft Days Tour 2008 à Lille les 13 et 14 Octobre ! par RedoBlog - The .NET Gentleman !!! le il y a 23 heures et 52 minutes

- MVC Pratique #07 - Un projet concret et le transfert des objets avec les ModelBinders par #Rui le 10-09-2008, 23:39

- SQL Server 2008 : Certifié - TS Admin (70-432) par SQL Server vu par Christian Robert le 10-09-2008, 10:58

- [WPF] Comment changer la couleur utilisée pour sélectionner les éléments d’un ItemsControl ? par Thomas Lebrun le 10-09-2008, 10:49

- Hello World! par Hamid's Place le 10-08-2008, 23:38

- SQL Profiler - Configuration pour un développeur - tracer les requêtes SQL de votre application par Atteint de JavaScriptite Aiguë [Cyril Durand] le 10-08-2008, 15:52

- Monitoring et Patron de méthode par Le blog de Marc Ranchin le 10-08-2008, 10:22