2009-12-02 3 views

Répondre

89

Peut être effectué via changing the Collation. 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 
+0

Comment utiliser lorsque nous avons à la place =. comme WHERE CustID dans (@CustID) – rinuthomaz

140

En utilisant la collation ou coulée en 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 fournir au moteur la possibilité d'utiliser les index . Le classement ci-dessus est un classement sensible à la casse, remplacez celui dont vous avez besoin si nécessaire.

La seconde, coulée en binaire, pourrait être fait 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 
+8

Les personnes lisant cette question peuvent également trouver utile de lire comment modifier la colonne elle-même pour qu'elle soit sensible à la casse, ce qui élimine le besoin d'utiliser le classement dans la clause WHERE. Voir: http://stackoverflow.com/a/485394/908677 –

+0

La méthode cast comme varbinary a fonctionné pour moi lorsqu'elle est utilisée directement sur la base de données, mais n'a pas fonctionné lors de l'envoi de la même instruction à partir d'une application .NET - aucune idée pourquoi . Mais la méthode d'assemblage a bien fonctionné. – Doug

+1

Cette réponse serait parfaite si elle incluait une explication de l'endroit où placer le terme recherché, c'est-à-dire où la phrase semblable à un mot ou à une expression régulière "" '" recherche SQL serait insérée. –

13

Vous pouvez faire la requête à l'aide convertir en varbinary - il est très facile. Exemple:

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

UTILISATION BINARY_CHECKSUM

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

Cela ne veut-il pas dire que ce n'est plus une comparaison exacte?Il peut arriver parfois que cela redevienne vrai qu'ils ne sont pas réellement les mêmes? –

+1

Je suis d'accord @ O'Rooney ce sera à l'occasion de retourner les faux positifs. –

4

utilisation 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 
2

MySQL si vous ne voulez pas modifier le classement et que vous souhaitez effectuer des recherche sensible alors il suffit d'utiliser binaire mot-clé comme ceci:

SELECT * FROM table_name WHERE binary [email protected]_parameter and binary [email protected]_parameter 
+0

Ce n'est pas une requête SQL Server valide. Je pense que c'est MySQL –

+1

Fonctionne parfaitement sur MySQL –

1

utilisation Latin1_General_CS comme votre collation dans votre sql db

Questions connexes