【发布时间】:2016-10-10 19:27:06
【问题描述】:
今天遇到一个有趣的问题,想知道该行为背后的原因。我有一个包含用户名的用户表,我对此进行查询以提取唯一用户,然后使用所有散列和咸味进行密码检查。
但是,如果我将表情符号放入查询中,用户仍会退出数据库,我想知道为什么以及需要应用什么设置。我正在使用 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!
我可以将表情符号放在任何地方,想放多少就放多少,用户仍然会返回。我显然可以将 C# 代码放在适当的位置,以便进行额外的检查,所以这个问题在那里可以解决,但我希望它在数据库级别解决,因为可能有许多其他查询可以进行字符串比较。
密码中的表情符号不是问题,因为散列和加盐将在 C# 中应用,所以密码中的表情符号很好。
【问题讨论】:
-
数据库的排序规则设置是什么?
-
SQL_Latin1_General_CP1_CI_AS
-
CP1 表示code page 1252,我假设该代码页中没有的任何内容都将被完全忽略。
-
@ErikPhilips 这也是我的猜测......虽然我不知道具体细节,但默认情况下,引擎可能会忽略不属于已知排序规则的任何内容。尝试在整理设置文档/文章中四处寻找线索。
-
文字
'some????user????'不有这个效果。因为它被视为some??user??。因此,我已将您的示例更改为N'some????user????'- 确实如此。
标签: c# sql-server unicode collation