2014-10-28 88 views
1

在比較兩個字符串時,SQL Server 2008似乎刪除了一些unicode字符。請看下面的表格:SQL Server 2008和Unicode字符比較

CREATE TABLE [dbo].[Test](
[text] [nvarchar](50) NOT NULL, 
    CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED 
    (
    [text] ASC 
)) 

現在,如果我插入一些行Unicode字符:

insert into Test values(N'it᧠') 
insert into Test values(N'it') 

我得到一個唯一約束的例外,即使值是不同的。我在這裏使用默認的數據庫排序規則,即SQL_Latin1_General_CP1_CI_AS。

Violation of PRIMARY KEY constraint 'PK_Test'. Cannot insert duplicate key in object 'dbo.Test'. 

注意,這並不會發生所有Unicode字符,但僅限於一些字符,但我一直沒能找出其中的unicode範圍究竟是有問題的。例如,dingbat 0x2757(❗)在比較中被移除,但是0x2764(♥)不是。我想這與0x2757來自一個更新的unicode標準有關。

所以問題是,是否有任何方法使SQL Server 2008與這些字符一起工作,或者,我是否可以通過編程方式檢測它們(在C#中,通過unicode範圍或某些類型)並事先刪除它們?

+0

檢查了這一點http://stackoverflow.com/questions/4144767/unicode-characters-in-sql-table – Bayeni 2014-10-28 08:16:08

+0

你應該設置您的字段類型爲'nvarchar' – 2014-10-28 08:20:34

+0

@Bayeni,並不真正有幫助。我正在使用nvarchar和N前綴。 unicode值正確顯示在表中,問題在於比較。 – 2014-10-28 08:22:30

回答

1

好了,所以多一點挖表明這幾乎可以肯定是由於新的角色,因爲這也與SQL服務器工作2008等效拉丁整理,但不是舊版本,即與Latin1_General_100_CI_AS工作,但不能與Latin1_General_CI_AS 。爲了得到歸類的完整列表是正確地比較這些字符串我用:

IF OBJECT_ID('Tempdb..#T') IS NOT NULL 
    DROP TABLE #T; 
IF OBJECT_ID('Tempdb..#V') IS NOT NULL 
    DROP TABLE #V; 

CREATE TABLE #V (A NVARCHAR(50), B NVARCHAR(50)); 
INSERT #V (A, B) VALUES (N'it᧠', N'it'); 

CREATE TABLE #T (Collation VARCHAR(500), Match BIT); 

DECLARE @SQL NVARCHAR(MAX) = (SELECT N'INSERT #T (Collation, Match) 
             SELECT ''' + Name + ''', CASE WHEN A = B COLLATE ' + name + ' THEN 1 ELSE 0 END 
             FROM #V;' 
           FROM sys.fn_helpcollations() 
           FOR XML PATH(''), TYPE 
          ).value('.', 'NVARCHAR(MAX)'); 

EXECUTE sp_executesql @SQL; 

SELECT * 
FROM #T 
WHERE Match = 0;