web-dev-qa-db-fra.com

SQL Server vérifie la sensibilité à la casse?

Comment puis-je vérifier si une base de données dans SQL Server est sensible à la casse? J'ai déjà exécuté la requête:

SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END

Mais je cherche d'autres moyens car cela m'a posé des problèmes dans le passé.

Modifier - Un peu plus d'informations: un produit existant possède de nombreuses procédures stockées pré-écrites. Dans une procédure stockée @test != @TEST selon la sensibilité du serveur lui-même. Donc, ce que je recherche, c'est la meilleure façon de vérifier la sensibilité du serveur.

47
Kyle

Le classement peut être défini à différents niveaux:

  1. Serveur
  2. Base de données
  3. Colonne

Vous pouvez donc avoir une colonne sensible à la casse dans une base de données insensible à la casse. Je n'ai pas encore rencontré de situation où une analyse de rentabilisation pourrait être faite pour la sensibilité à la casse d'une seule colonne de données, mais je suppose qu'il pourrait y en avoir.

Vérifier le classement du serveur

SELECT SERVERPROPERTY('COLLATION')

Vérifier le classement de la base de données

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;

Vérifier le classement des colonnes

select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
71
Raj More

Si vous avez installé SQL Server avec les options de classement par défaut, vous pouvez constater que les requêtes suivantes renvoient les mêmes résultats:

CREATE TABLE mytable 
( 
    mycolumn VARCHAR(10) 
) 
GO 

SET NOCOUNT ON 

INSERT mytable VALUES('Case') 
GO 

SELECT mycolumn FROM mytable WHERE mycolumn='Case' 
SELECT mycolumn FROM mytable WHERE mycolumn='caSE' 
SELECT mycolumn FROM mytable WHERE mycolumn='case' 

Vous pouvez modifier votre requête en forçant le classement au niveau de la colonne:

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'caSE' 

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'case' 

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'Case' 

-- if myColumn has an index, you will likely benefit by adding 
-- AND myColumn = 'case' 

SELECT DATABASEPROPERTYEX('<database name>', 'Collation') 

Étant donné que la modification de ce paramètre peut avoir un impact sur les applications et les requêtes SQL, j'isolerais d'abord ce test. À partir de SQL Server 2000, vous pouvez facilement exécuter une instruction ALTER TABLE pour modifier l'ordre de tri d'une colonne spécifique, la forçant à être sensible à la casse. Tout d'abord, exécutez la requête suivante pour déterminer ce dont vous avez besoin pour la rétablir:

EXEC sp_help 'mytable' 

Le deuxième jeu d'enregistrements doit contenir les informations suivantes, dans un scénario par défaut:

Classement Column_Name


mycolumn SQL_Latin1_General_CP1_CI_AS

Quel que soit le résultat de la colonne "Collation", vous savez maintenant à quoi vous devez la remplacer après avoir effectué la modification suivante, ce qui forcera la sensibilité à la casse:

ALTER TABLE mytable 
    ALTER COLUMN mycolumn VARCHAR(10) 
    COLLATE Latin1_General_CS_AS 
GO 



SELECT mycolumn FROM mytable WHERE mycolumn='Case' 
SELECT mycolumn FROM mytable WHERE mycolumn='caSE' 
SELECT mycolumn FROM mytable WHERE mycolumn='case' 

Si cela bousille les choses, vous pouvez le changer en arrière, simplement en émettant une nouvelle instruction ALTER TABLE (assurez-vous de remplacer mon identifiant COLLATE par celui que vous avez trouvé précédemment):

ALTER TABLE mytable 
    ALTER COLUMN mycolumn VARCHAR(10) 
    COLLATE SQL_Latin1_General_CP1_CI_AS 

Si vous êtes bloqué avec SQL Server 7.0, vous pouvez essayer cette solution de contournement, qui pourrait être un peu plus un impact sur les performances (vous ne devriez obtenir un résultat que pour la PREMIÈRE correspondance):

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('Case' AS VARBINARY(10)) 

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('caSE' AS VARBINARY(10)) 

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('case' AS VARBINARY(10)) 

-- if myColumn has an index, you will likely benefit by adding 
-- AND myColumn = 'case' 
33
Will Marcouiller

Le serveur SQL détermine la sensibilité à la casse par COLLATION.

COLLATION peut être défini à différents niveaux.

  1. Au niveau du serveur
  2. Au niveau de la base de données
  3. Niveau colonne
  4. Niveau d'expression

Voici la référence MSDN.

On peut vérifier le COLLATION à chaque niveau comme mentionné dans réponse de Raj More .

Vérifier le classement du serveur

SELECT SERVERPROPERTY('COLLATION')

Vérifier le classement de la base de données

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;

Vérifier le classement des colonnes

select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name

Vérifier le classement des expressions

Pour le niveau d'expression COLLATION, vous devez regarder l'expression. :)

Ce serait généralement à la fin de l'expression comme dans l'exemple ci-dessous.

SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;

Description du classement

Pour obtenir la description de chaque valeur COLLATION, essayez ceci.

SELECT * FROM fn_helpcollations()

Et vous devriez voir quelque chose comme ça.

enter image description here

Vous pouvez toujours mettre une clause WHERE pour filtrer et voir la description uniquement pour votre COLLATION.

Vous pouvez trouver une liste des classements ici .

7
Devraj Gadhavi

Vous êtes intéressé par la collation. Vous pouvez créer quelque chose en fonction de cet extrait:

SELECT DATABASEPROPERTYEX('master', 'Collation');

Mise à jour
Selon votre modification - Si @test et @TEST peut jamais faire référence à deux variables différentes, ce n'est pas SQL Server. Si vous voyez des problèmes où la même variable n'est pas égale à elle-même, vérifiez si cette variable est NULL, car NULL = NULL renvoie `false.

4
Joel Coehoorn

La meilleure façon de travailler avec des tables déjà créées est la suivante: Aller à l'Éditeur de requête du serveur SQL

Type: sp_help <tablename>

Cela montrera la structure du tableau, voir les détails du champ souhaité dans la colonne COLLATE.

puis tapez la requête comme:

SELECT myColumn FROM myTable  
WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = 'Case'

Il peut s'agir d'un schéma de caractères différent <SQL_Latin1_General_CP1_CI_AS>, il vaut donc mieux connaître le schéma exact qui a été utilisé pour cette colonne.

2
DareDevil

Comment puis-je vérifier si une base de données dans SQL Server est sensible à la casse?

Vous pouvez utiliser la requête ci-dessous qui renvoie que votre base de données informée est sensible à la casse ou non ou est en tri binaire (avec un résultat nul):

;WITH collations AS (
    SELECT 
        name,
        CASE 
            WHEN description like '%case-insensitive%' THEN 0 
            WHEN description like '%case-sensitive%' THEN 1 
        END isCaseSensitive
    FROM 
        sys.fn_helpcollations()
)
SELECT *
FROM collations
WHERE name = CONVERT(varchar, DATABASEPROPERTYEX('yourDatabaseName','collation'));

Pour en savoir plus ces informations MSDN ;).

1
shA.t