2010-05-17 57 views
2

我在我的sql服務器數據庫中有一個記錄,對於nvarchar列有以下值: '穂阪' 第二個字符是Unicode值0x20這是一個簡單的空間字符。與中國空白的SQL服務器字符串比較問題

該列上有一個唯一的鍵約束。

我得到一個唯一鍵衝突,當我嘗試插入以下值: 「穂阪」 在這個字符串,第二個字符是Unicode值0x3000處,這是一箇中國的空格字符。

爲什麼我會得到唯一的密鑰違規?爲什麼sql server將中文空白字符「轉換」爲簡單的空間?

在此先感謝您的任何見解! 順便說一句,我的排序規則是SQL_Latin1_General_CP1_CI_AS。

回答

0

這可能是您的排序規則爲width-insensitive

考慮:

  • 更改數據庫的歸類到一個適合您的需求,它的寬度敏感。
  • 將該特定列上的排序規則更改爲寬度敏感列。這可能會導致更多COLLATE clauses整個存儲過程等等。不知道這是否是DBA推薦的做法。

alt text

+0

我試圖轉換爲寬度敏感覈對(Latin1_General_CI_AS_WS),但插入件仍然沒有原因唯一密鑰違反。 – 2010-05-17 20:54:45

1

首先,你可以使用SQL選擇恰當的字符串類型,包括排序規則。 其次,您可以使用以N前綴開頭的UNICODE字符串。

實施例:

SELECT CAST(N'穂 阪' COLLATE Chinese_Simplified_Pinyin_100_BIN2 AS VARBINARY(32)) 

=> 0x427A20004257

SELECT CAST(N'穂 阪' COLLATE Chinese_Simplified_Pinyin_100_BIN2 AS VARBINARY(32)) 

=> 0x427A00304257