2012-11-01 4 views
0

몇 가지 특수 유니 코드 문자에 의해서만 달라지는 기본 키가있는 레코드를 삽입하는 데 문제가 있습니다.SQL Server의 기본 키에 유니 코드 문자열을 사용하는 방법

예를 들어 기본 키가 "test" 인 레코드를 데이터베이스에 이미 가지고 있고 기본 키가 "test + '\u13A4' + '\u13B4' + '\u13B9'" 인 다른 레코드를 삽입하려고하면 중복 키 오류가 발생합니다. SQL Server 2012와 함께 EF 5를 사용하고 있습니다.

기본 키는 nvarchar으로 정의되며 데이터 정렬은 SQL_Latin1_General_CP1_CI_AS으로 설정됩니다. 그것은 거기에 특수 유니 코드 문자가있는 경우 기본 키에 대한 조회를 할 수 있지만 그냥 유니 코드 특수 문자 (위의 예제와 같이)에 따라 다릅니다 삽입에 대한 중복 키 오류가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까?

+0

여기에 언급 된대로 Latin1_General_100_CI_AS_SC를 사용해보십시오. http://msdn.microsoft.com/en-us/library/ms143726.aspx – Jimbo

답변

1

SQL_Latin1_CP1 데이터 정렬은 모든 유니 코드 코드를 충족하지 못합니다.

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 

사용중인 유니 코드 문자가 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# 코드 및 특수 유니 코드 문자를 이스케이프 방법입니다. 귀하의 테스트 단지 이스케이프 시퀀스 및 실제 유니 코드 문자가 아닌 문자열을 삽입하는 것입니다. TSQL의 경우 10 진수 값으로 nchar을 사용해야합니다. N'test '+ nchar (5028) + nchar (5044) + nchar (5049)를 사용하면 실패합니다. –

관련 문제