为什么SQL Server忽略了equals语句中的表情符号?

时间:2016-06-09 23:42:42

标签: c# sql-server unicode collation

今天遇到了一个有趣的问题,想知道行为背后的原因。我有一个带有用户名的用户表,我对此进行查询以将唯一用户拉出来,然后对所有散列和咸味善良进行密码检查。

但是,如果我将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#中应用,因此密码中的表情符号都可以。

1 个答案:

答案 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