sql严格等于,有什么事吗?

时间:2010-06-14 07:35:06

标签: sql sql-server

  

可能重复:
  SQL server ignore case in a where expression

基本上我需要检查这样的东西

select * from users where name = @name, pass = @pass
问题是'pass' = 'pAsS'

对于sql(ms sql-server)

中的字符串比较有更严格的要求

6 个答案:

答案 0 :(得分:7)

这取决于你的整理,它似乎不区分大小写。例如,标准排序规则为Latin1_General_CI_AS,其中CI表示不区分大小写。您可以强制使用不同的协作进行不同的比较:

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

顺便说一句,你不应该在你的数据库中存储密码 - 你应该对它们进行盐化和散列。

答案 1 :(得分: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使用传递列上的任何索引。

答案 2 :(得分:1)

您需要使用区分大小写的排序规则进行比较:

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

有关详细信息,请参阅this文章。

答案 3 :(得分:1)

这与数据库整理有关。

这可以帮到你:

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

有关SQL Server中的排序规则的一些信息here

答案 4 :(得分:1)

对于区分大小写,您需要在查询中指定排序规则。类似的东西:

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

答案 5 :(得分:1)

使用二进制排序规则确保完全匹配。

WHERE pass = @pass COLLATE Latin1_General_BIN