今天遇到一个有趣的问题,想知道行为背后的原因。我有一个带有用户名的users表,我根据它进行查询,将唯一的用户拉出来,然后使用所有散列和salty goody进行密码检查。
但是,如果我在查询中放入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'some🐶user🐶' --ALSO WORKS!
我可以把emojis放在任何地方,我想放多少就放多少,用户仍然会被返回。很明显,我可以把C代码放在适当的位置,这样就可以进行额外的检查,所以这个问题在那里是可以解决的,但是我希望在数据库级别解决这个问题,因为可能还有许多其他查询进行字符串比较。
密码中的emojis不是问题,因为散列和盐析将在c中应用,所以密码中的emojis很好。
最佳答案
您正在使用的排序规则不支持比较emoji字符,因此它会忽略它们。如果希望按正常预期工作,可以在比较期间使用特定的排序规则:
select *
from (values
(N'some🐶user🐶', N'someuser')
, (N'someuser', N'someuser')
, (N'some🐶user🐶', N'some🐶user🐶')
) as a (L, R)
where a.L = a.R collate Latin1_General_100_CI_AS_SC;
有关详细信息,请参阅msdn文章Collation and Unicode Support。