2009-08-03 6 views

Répondre

103

Dans la configuration par défaut d'une base de données SQL Server, les comparaisons de chaînes sont insensible à la casse. Si votre base de données remplace ce paramètre (par l'utilisation d'un autre classement), vous devez spécifier le type de classement à utiliser dans votre requête. Notez que le classement que j'ai fourni est juste un exemple (bien que cela fonctionnera probablement très bien pour vous). Un aperçu plus complet des classements SQL Server peut être trouvé here.

2

Qu'est-ce que la base de données sont-vous? Avec MS SQL Server, il s'agit d'un paramètre à l'échelle de la base de données ou vous pouvez le remplacer par requête avec le mot-clé COLLATE.

25

Habituellement, les comparaisons de chaînes sont insensibles à la casse. Si votre base de données est configuré pour classement respectant la casse, vous devez forcer à utiliser insensible à la casse un:

SELECT balance FROM people WHERE email = '[email protected]' 
    COLLATE SQL_Latin1_General_CP1_CI_AS 
+3

On dirait que quelqu'un est plus rapide que moi :-) –

+4

+1 J'ai aimé votre résumé (et sans barre de défilement) répondre plus. –

4

Vous pouvez forcer la casse, jetant à un varbinary comme ça:

SELECT * FROM myTable 
WHERE convert(varbinary, myField) = convert(varbinary, 'sOmeVal') 
+2

Bien que ce soit fonctionnel, ce n'est pas une approche souhaitable. Les collations sont là pour gérer le tri et les comparaisons de chaînes. –

+0

@AdamRobinson n'est ce pas à propos de "comparaisons de chaînes" cependant? – Fandango68

19

I trouvé une autre solution ailleurs; qui est, ici pour utiliser

upper(@yourString) 

mais tout le monde dit que, dans SQL Server, il n'a pas d'importance parce qu'il est ignorant la casse de toute façon? Je suis sûr que notre base de données est sensible à la casse.

+4

Vous avez raison de dire qu'une base de données peut être rendue sensible à la casse, mais c'est assez inefficace, même si c'est nécessaire. COLLATE est le mot-clé à utiliser. – mjaggard

+1

Merci d'avoir soulevé cette question, @mjaggard. J'espère que vous, ou toute personne qui semble minimiser ma réponse, élaborer pour le bien de quelqu'un comme moi qui cherche et trouve des réponses comme la mienne. – Danny

+1

Upvoted ceci comme c'est une explication parfaitement rationnelle. Assembler sent trop de frais généraux et si votre chaîne contient des caractères que le classement ne comprend pas? Latin 1 est un schéma d'encodage moche.Bonne chance d'obtenir des résultats significatifs si votre chaîne a une apostrophe (Comme: O'Brien). – eggmatters

5

Non, seule l'utilisation de LIKE ne fonctionnera pas. LIKE recherche les valeurs correspondant exactement à votre modèle donné. Dans ce cas, LIKE ne trouverait que le texte 'sOmeVal' et non 'someval'. Une solution pratique utilise la fonction LCASE(). LCASE('sOmeVal') obtient la chaîne minuscule de votre texte: 'someval'. Si vous utilisez cette fonction pour les deux côtés de la comparaison, il fonctionne:

SELECT * FROM myTable WHERE LCASE(myField) LIKE LCASE('sOmeVal')

L'instruction suivante compare deux chaînes minuscules, de sorte que votre « sOmeVal » correspondra à tous les notations de « someval » (par exemple « Someval ',' sOMEVAl 'etc.).

+6

Dans 99,9% des installations SQL Server qui sont assemblées _CI, LIKE est Insensible à la casse. – RichardTheKiwi

Questions connexes