今天遇到了一个有趣的问题,想知道行为背后的原因。我有一个带有用户名的用户表,我对此进行查询以将唯一用户拉出来,然后对所有散列和咸味善良进行密码检查。
但是,如果我将emojis放入查询中,用户仍然会退出数据库,并且我想知道为什么以及需要应用什么设置。我正在使用EF,但我测试了原始的T-SQL,行为是一样的,因此EF不是罪魁祸首。
SELECT TOP 1 *
FROM Users
WHERE username = N'someuser' --Works as expected
SELECT TOP 1 *
FROM Users
WHERE username = N'someuser' --ALSO WORKS!
我可以把emojis放在任何地方,尽可能多的用户仍然可以返回。我显然可以使用C#代码来进行额外的检查,因此这个问题在那里是可以解决的,但我希望它在数据库级解决,因为可能有许多其他查询进行字符串比较。
密码中的Emojis不是问题,因为散列和盐析将在C#中应用,因此密码中的表情符号都可以。
答案 0 :(得分:1)
您使用的排序规则并不支持表情符号字符的比较,因此忽略它们。如果您希望事情按照您通常的预期运作,您可以在比较期间使用特定的排序规则:
select *
from (values
(N'someuser', N'someuser')
, (N'someuser', N'someuser')
, (N'someuser', N'someuser')
) as a (L, R)
where a.L = a.R collate Latin1_General_100_CI_AS_SC;
有关详细信息,请参阅MSDN文章Collation and Unicode Support。