可能重複:
SQL server ignore case in a where expressionsql嚴格等於,有什麼東西嗎?
基本上我需要檢查這樣的事情
select * from users where name = @name, pass = @pass
問題是'pass' = 'pAsS'
有更多的東西嚴格的ST在sql中的循環比較(ms sql-server)
可能重複:
SQL server ignore case in a where expressionsql嚴格等於,有什麼東西嗎?
基本上我需要檢查這樣的事情
select * from users where name = @name, pass = @pass
問題是'pass' = 'pAsS'
有更多的東西嚴格的ST在sql中的循環比較(ms sql-server)
這是歸結於您的整理,它似乎是不區分大小寫。例如,標準歸類爲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
順便說一句,你不應該存儲在數據庫中的密碼 - 你應該醃製和哈希他們。
您需要使用大小寫敏感排序規則比較:
SELECT * FROM users
WHERE name = @name, pass = @pass
COLLATE SQL_Latin1_General_Cp1_CS_AS
見this文章的更多細節。
這與數據庫整理有關。
這會幫助你:
select * from users where name = @name, pass = @pass COLLATE SQL_Latin1_General_CP1_CS_AS
有一些信息here關於在SQL Server
排序規則是大小寫敏感的,你需要在查詢中指定排序規則。例如:
select * from users where name = @name, pass = @pass COLLATE SQL_Latin1_General_Cp1_CS_AS
由於其他人已經發布,您可以在查詢中使用排序規則或將「傳遞」列的排序規則更改爲區分大小寫。你也可以改變您的查詢使用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使用傳遞列上的任何索引。
使用二進制排序規則確保完全匹配。
WHERE pass = @pass COLLATE Latin1_General_BIN
但是,比較散列密碼時,比較應該是有區別的。 :) – Guffa 2010-06-14 07:43:56
是的確 - 區分大小寫的二進制! – 2010-06-14 07:48:47
大拇指,但是在哈希中也要求區分大小寫 – 2017-11-10 18:21:41