Question

Comment 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 solutions, car cela m'a en fait posé des problèmes par le passé.

Edit - Un peu plus d'infos: Un produit existant comporte de nombreuses procédures stockées pré-écrites. Dans une procédure stockée @test != @TEST en fonction de la sensibilité du serveur lui-même. Ce que je recherche, c’est donc le meilleur moyen de vérifier la sensibilité du serveur.

Était-ce utile?

La solution

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

  1. serveur
  2. Base de données
  3. colonne

Ainsi, vous pourriez avoir une colonne sensible à la casse dans une base de données insensible à la casse. Je ne suis pas encore tombé sur une situation où l'on pourrait faire une analyse de rentabilisation pour tenir compte de la sensibilité à la casse d'une seule colonne de données, mais je suppose qu'il pourrait en être ainsi.

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

Autres conseils

Si vous avez installé SQL Server avec les options de classement par défaut, il est possible 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 une incidence sur les applications et les requêtes SQL, je voudrais d’abord isoler ce test. A 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, ce qui la rend sensible à la casse. Commencez par exécuter la requête suivante pour déterminer en quoi vous devez la reconvertir:

EXEC sp_help 'mytable' 

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

Classement Nom_colonne

mycolumn SQL_Latin1_General_CP1_CI_AS

Quel que soit le retour de la colonne "Classement", vous savez maintenant en quoi vous devez le rétablir après avoir effectué le changement suivant, 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 vous gêne, vous pouvez le modifier, simplement en émettant une nouvelle instruction ALTER TABLE (veillez à 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 coincé avec SQL Server 7.0, vous pouvez essayer cette solution de contournement, qui risque d’être un peu plus lourde en performances (vous ne devriez obtenir un résultat que pour la correspondance FIRST):

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' 

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

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

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

Voici la référence MSDN.

On peut consulter le <=> niveau à chaque niveau, comme indiqué dans la 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

Collation de vérification de l'expression

Pour le niveau d'expression <=>, vous devez examiner 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 une description de chaque <=> valeur, essayez ceci.

SELECT * FROM fn_helpcollations()

Et vous devriez voir quelque chose comme ça.

entrer la description de l

Vous pouvez toujours mettre une clause <=> à filtrer et voir la description uniquement pour votre <=>.

Vous pouvez trouver une liste des classements ici. .

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

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

Mettre à jour
Basé sur votre modification & # 8212; Si @test et @TEST peuvent faire référence à deux variables différentes, ce n'est pas SQL Server. Si vous rencontrez des problèmes pour lesquels la variable identique n'est pas égale à elle-même, vérifiez si cette variable est NULL, car NULL = NULL renvoie `false.

La meilleure façon de travailler avec des tables déjà créées est la suivante: Accédez à l'éditeur de requêtes SQL Server

Type: sp_help <tablename>

Ceci affichera la structure de la table. Consultez les détails du champ souhaité dans la colonne COLLATE.

puis tapez la requête comme suit:

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

Il pourrait s'agir d'un schéma de caractère différent < SQL_Latin1_General_CP1_CI_AS > ;, il est donc préférable de connaître le schéma exact utilisé pour cette colonne.

  

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

Vous pouvez utiliser la requête ci-dessous qui renvoie votre base de données informée, est sensible ou non à la casse 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, lisez ces informations MSDN ;).

SQL Server n’est pas sensible à la casse. SELECT * FROM SomeTable est identique à SeLeCT * frOM soMetaBLe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top