2013-01-08 38 views
1

在我的數據庫中,我有翻譯表,其中包含用於將不尋常的Unicode字符轉換爲英文字符的字典。 Unicode字符是此表的主鍵。 而前一段時間,我遇到了一個問題:一些不同的Unicode字符對於T-SQL是相同的,它們在同一時間沒有任何東西。爲什麼在T-SQL中一些unicode字符等於沒有?

我可以找到區分另一種方法('='是無用的),甚至設法將其中一個插入到數據庫中。但是,由於主鍵約束,我不能插入多於一個,而它們全部相等。

我發現只是4:ŞşŢţ。但是4只足以破壞我的系統。

而且這是他們如何做人短,但內容豐富例如:

DECLARE @Strings TABLE(id int, ucode nvarchar(50)) 
INSERT INTO @Strings (id, ucode) 
    SELECT 1, N'A' UNION -- Usual char 
    SELECT 2, N'Ы' UNION -- Some unicode char  
    SELECT 3, N'Ф' UNION -- Another unicode char 
    SELECT 5, N' ' UNION -- space 
    SELECT 6, N'Ș' UNION -- Unusual unicode char 
    SELECT 7, N'Ț' UNION -- Unusual unicode char 
    SELECT 8, N'some_string' UNION  -- example string 
    SELECT 9, N'some_string ' UNION  -- example string with space 
    SELECT 10, N'some_string Ș' UNION -- example string with unusual char 
    SELECT 11, N'some_string Ț'   -- one more 

SELECT * FROM @Strings 
SELECT * FROM @Strings WHERE ucode = N'A' -- Good one (1 result) 
SELECT * FROM @Strings WHERE ucode = N'Ș' -- Magic (3 results) 
SELECT * FROM @Strings WHERE ucode = N'Ț' -- Magic (3 results) 
SELECT * FROM @Strings WHERE ucode = '' -- Magic (3 results) 
SELECT * FROM @Strings WHERE ucode = 'some_string' -- Magic (4 results) 

你有什麼建議嗎?

+3

你使用的是什麼排序規則,你在哪個版本上? –

+0

馬丁史密斯,我嘗試了SQL_Latin1_General_CP1_CI_AS和Cyrillic_General_CI_AS –

+1

還有你想要的大小寫和重音敏感度的語義? –

回答

5

=並非無用,但您需要指定=應如何比較。默認值是在數據庫級別設置的,並且您的列沒有指定不同的比較規則,因此您的列將獲取數據庫的比較規則。主鍵使用與=相同的比較規則,因此將其固定爲一個也會使其他工作按照您的意圖進行。

指定比較規則是使用COLLATE keyword完成的。應將所有代碼點視爲不同字符的排序規則爲Latin1_General_BIN2

DECLARE @Strings TABLE(id int, ucode nvarchar(50) COLLATE Latin1_General_BIN2) 
相關問題