基本上我需要检查这样的东西
select * from users where name = @name, pass = @pass
问题是'pass' = 'pAsS'
对于sql(ms sql-server)
中的字符串比较有更严格的要求答案 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