2012-11-01 97 views
0

我在插入帶有僅由某些特殊Unicode字符變化的主鍵的記錄時遇到問題。如何在SQL Server中爲主鍵使用Unicode字符串

例如,如果我在數據庫中已經有一個記錄,並且主鍵爲"test",並且我試圖插入另一個主鍵爲"test + '\u13A4' + '\u13B4' + '\u13B9'"的記錄,則會出現重複的鍵錯誤。我正在使用EF 5和SQL Server 2012.

主鍵定義爲nvarchar,並且排序規則設置爲SQL_Latin1_General_CP1_CI_AS。如果在那裏有特殊的Unicode字符,它可以在主鍵上進行查找,但是如果它只是因Unicode特殊字符而異(如上面的示例中所示),我會在插入時得到重複的鍵錯誤。你如何解決這個問題?

+0

嘗試使用排序規則Latin1_General_100_CI_AS_SC,如下所述:http://msdn.microsoft.com/en-us/library/ms143726.aspx – Jimbo

回答

1

SQL_Latin1_CP1排序規則不適用於所有Unicode碼點。

select N'test' collate SQL_Latin1_General_CP1_CI_AS 
union 
select N'test' + nchar(5028) + nchar(5044) + nchar(5049) 
-- result: 1 row 

使用SQL Server 2008以後的新版本,例如,

select N'test' collate Latin1_General_100_CI_AS 
union 
select N'test' + nchar(5028) + nchar(5044) + nchar(5049) 
-- result: 2 rows 

您使用的Unicode字符落在16位字符範圍內,所以補充字符不會發揮作用。

+0

謝謝。這解決了我的問題。 –

0

這必須與您如何連接字符串有關。以下適用於我:

CREATE TABLE #UnicodeTest (
     UnicodePK NVARCHAR(100) COLLATE SQL_Latin1_General_CP1_CI_AS PRIMARY KEY 
    ) 

    INSERT #UnicodeTest 
      (UnicodePK) 
    VALUES (N'test' 
      ) 

    INSERT #UnicodeTest 
      (UnicodePK) 
    VALUES (N'test\u13A4\u13B4\u13B9' 
      ) 

    INSERT #UnicodeTest 
      (UnicodePK) 
    VALUES (N'test + \u13A4 + \u13B4 + \u13B9' 
      ) 

    INSERT #UnicodeTest 
      (UnicodePK) 
    VALUES (N'test + ''\u13A4'' + ''\u13B4'' + ''\u13B9''' 
      ) 


    SELECT * FROM #UnicodeTest 

    DROP TABLE #UnicodeTest 
+0

謝謝你的回覆。我的問題中的字符串是C#代碼,這就是你如何轉義特殊的Unicode字符。你的測試只是插入一個帶有轉義序列的字符串,而不是實際的Unicode字符。對於TSQL,您需要使用具有十進制值的nchar。如果使用N'test'+ nchar(5028)+ nchar(5044)+ nchar(5049),它將失敗。 –

相關問題