191 votes

Comment faire une recherche sensible à la casse dans la clause WHERE (j'utilise SQL Server) ?

Je veux faire une recherche sensible à la casse dans ma requête SQL. Mais par défaut, SQL Server ne prend pas en compte le cas des chaînes.

Une idée sur la façon de faire une recherche sensible à la casse dans une requête SQL ?

228voto

Ashish Jain Points 1000

Peut être fait en changeant le collationnement. Par défaut, il est insensible à la casse.

Extrait du lien :

SELECT 1
FROM dbo.Customers
WHERE   CustID = @CustID COLLATE SQL_Latin1_General_CP1_CS_AS
    AND CustPassword = @CustPassword COLLATE SQL_Latin1_General_CP1_CS_AS

Ou, changez les colonnes pour qu'elles soient sensibles à la casse.

167voto

Jonas Lincoln Points 4330

En utilisant le collationnement ou la coulée sur binaire, comme ceci :

SELECT *
FROM Users
WHERE   
    Username = @Username COLLATE SQL_Latin1_General_CP1_CS_AS
    AND Password = @Password COLLATE SQL_Latin1_General_CP1_CS_AS
    AND Username = @Username 
    AND Password = @Password 

La duplication du nom d'utilisateur/mot de passe existe pour donner au moteur la possibilité d'utiliser des index. Le collationnement ci-dessus est un collationnement sensible à la casse, passez à celui dont vous avez besoin si nécessaire.

La seconde, coulée en binaire, pourrait se faire comme ceci :

SELECT *
FROM Users
WHERE   
    CAST(Username as varbinary(100)) = CAST(@Username as varbinary))
    AND CAST(Password as varbinary(100)) = CAST(@Password as varbinary(100))
    AND Username = @Username 
    AND Password = @Password 

15voto

Juan Carlos Velez Points 717

Vous pouvez faire la requête en utilisant convertir en varbinaire – c'est très facile. Exemple :

Select * from your_table where convert(varbinary, your_column) = convert(varbinary, 'aBcD') 

7voto

Sandeep Points 1

UTILISER LA SOMME DE_CONTRÔLES_BINAIRES

SELECT 
FROM Users
WHERE   
    BINARY_CHECKSUM(Username) = BINARY_CHECKSUM(@Username)
    AND BINARY_CHECKSUM(Password) = BINARY_CHECKSUM(@Password)

6voto

Dub Points 85

utiliser HASHBYTES

declare @first_value nvarchar(1) = 'a'
declare @second_value navarchar(1) = 'A'

if HASHBYTES('SHA1',@first_value) = HASHBYTES('SHA1',@second_value) begin
    print 'equal'
end else begin
    print 'not equal'
end

-- output:
-- not equal

...dans la clause where

declare @example table (ValueA nvarchar(1), ValueB nvarchar(1))

insert into @example (ValueA, ValueB)
values  ('a', 'A'),
        ('a', 'a'),
        ('a', 'b')

select  ValueA + ' = ' + ValueB
from    @example
where   hashbytes('SHA1', ValueA) = hashbytes('SHA1', ValueB)

-- output:
-- a = a

select  ValueA + ' <> ' + ValueB
from    @example
where   hashbytes('SHA1', ValueA) <> hashbytes('SHA1', ValueB)

-- output:
-- a <> A
-- a <> b

ou pour trouver une valeur

declare @value_b nvarchar(1) = 'A'

select  ValueB + ' = ' + @value_b
from    @example
where   hashbytes('SHA1', ValueB) = hasbytes('SHA1', @value_b)

-- output:
-- A = A

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X