2013-10-10 58 views
4

我有我的表的定義如下:SQL Server的唯一約束問題的Unicode字符

create table [Language](
Id int primary key identity, 
Code varchar(11) not null unique, 
NativeName nvarchar(50) not null unique 
) 

然後,我有一個表插入語句的一個長長的清單。問題是一些插入語句在我的NativeName列的唯一約束上發生衝突。奇怪的是,內容並不是唯一的。例如,如果我只在表中插入以下空表:

insert into Language (Code, NativeName) values('am', N'አማርኛ'); 
insert into Language (Code, NativeName) values('dv', N'ދިވެހިބަސް‏'); 

我得到第二個插入。

Violation of UNIQUE KEY constraint 'UQ__Language__EB1957A5F98D1F9C'. Cannot insert duplicate key in object 'dbo.Language'. The duplicate key value is (ދިވެހިބަސް‏). 

有誰知道爲什麼unicode字符導致這些問題?

+0

聽起來像一個排序問題。請參閱[使用排序規則](http://technet.microsoft.com/en-us/library/ms187582(v = sql.105).aspx) – JDB

回答

3

嘗試用更具體的(二進制)排序規則聲明NativeName柱。

如:

NativeName nvarchar(50) collate SQL_Latin1_General_CP437_BIN not null unique 
+0

我知道這個查詢需要某種排序規則修正,但是您是如何確定只要我可以在OP正試圖插入的查詢中看到這兩種不同的語言,就可以找出哪種歸類可以完成這項工作。能否請您提供一些解釋謝謝提前:) –

+1

@MuhammedAli關鍵是它是一個二進制整理 - 我選擇了這一個,因爲它是一個通用的,而不是一個語言的整理,但很可能任何二進制排序會工作。 – podiluska

+0

這樣做,謝謝。說實話,我完全不知道發生了什麼。我認爲我必須對整個整理事情做一些研究。 – AxiomaticNexus