2010-06-14 40 views

回答

7

這是歸結於您的整理,它似乎是不區分大小寫。例如,標準歸類爲Latin1_General_CI_AS,其中CI表示不區分大小寫。您可以強制不同collaction了不同的比較:

select * 
from users 
where name = @name 
and  pass COLLATE Latin1_General_CS_AS = @pass COLLATE Latin1_General_CS_AS 

順便說一句,你不應該存儲在數據庫中的密碼 - 你應該醃製和哈希他們。

+1

但是,比較散列密碼時,比較應該是有區別的。 :) – Guffa 2010-06-14 07:43:56

+3

是的確 - 區分大小寫的二進制! – 2010-06-14 07:48:47

+0

大拇指,但是在哈希中也要求區分大小寫 – 2017-11-10 18:21:41

1

您需要使用大小寫敏感排序規則比較:

SELECT * FROM users 
WHERE name = @name, pass = @pass 
COLLATE SQL_Latin1_General_Cp1_CS_AS 

this文章的更多細節。

1

這與數據庫整理有關。

這會幫助你:

select * from users where name = @name, pass = @pass COLLATE SQL_Latin1_General_CP1_CS_AS 

有一些信息here關於在SQL Server

1

排序規則是大小寫敏感的,你需要在查詢中指定排序規則。例如:

select * from users where name = @name, pass = @pass COLLATE SQL_Latin1_General_Cp1_CS_AS 
3

由於其他人已經發布,您可以在查詢中使用排序規則或將「傳遞」列的排序規則更改爲區分大小寫。你也可以改變您的查詢使用VARBINARY類型,而不是改變歸類:

SELECT * FROM users 
WHERE name = @name 
AND pass = @pass 
AND CAST(pass AS VARBINARY(50)) = CAST(@pass AS VARBINARY(50)) 

注意,我離開了pass = @pass子句。在查詢中留下這一行允許SQL Server使用傳遞列上的任何索引。

1

使用二進制排序規則確保完全匹配。

WHERE pass = @pass COLLATE Latin1_General_BIN