为什么 SQL 服务器忽略 emoji 中的 equals 语句?

Why is SQL Server ignoring emoji's in equals statement?

今天遇到一个有趣的问题,想知道该行为背后的原因。我有一个用户 table 和用户名,我对此进行查询以拉出唯一用户,然后使用所有哈希和咸味进行密码检查。

但是,如果我将表情符号放入查询中,用户仍然会被从数据库中拉出,我想知道为什么以及需要应用什么设置。我正在使用 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!

我可以把表情符号放在任何地方,想放多少就放多少,用户仍然会回来。我显然可以将 C# 代码放在适当的位置进行额外的检查,这样这个问题就可以在那里解决,但我希望它在数据库级别得到解决,因为可能有许多其他查询进行字符串比较。

密码中的表情符号不是问题,因为将在 C# 中应用散列和加盐,因此密码中的表情符号没问题。

您使用的排序规则不支持emoji字符的比较;所以它忽略了它们。如果您希望事情像您通常期望的那样工作,您可以在比较期间使用特定的排序规则:

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