2016-06-09 27 views
4

今天遇到了一個有趣的問題,想知道行爲背後的原因。我有一個包含用戶名的用戶表,我用這個查詢來提取這個唯一的用戶,然後用所有的哈希和鹹的善良進行密碼檢查。爲什麼SQL Server在等號語句中忽略表情符號?

但是,如果我在查詢中添加了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#中,因此密碼中的emojis可以。

+1

爲數據庫設置的排序規則是什麼? –

+0

SQL_Latin1_General_CP1_CI_AS – ManOVision

+1

CP1的意思是[代碼頁1252](https://en.wikipedia.org/wiki/Windows-1252),我假設任何不在該代碼頁中的內容都被完全忽略。 –

回答

0

您使用的排序規則不支持表情符號字符的比較,因此忽略它們。

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更多的信息:如果你想要的東西的工作,你會通常希望可以在比較過程中使用特定的排序規則。