2011-02-15 3 views
1

다양한 소스의 다양한 문서의 구조화되지 않은 텍스트를 처리하고 있습니다. SQL Server Compact Edition 3.5를 사용하고 있습니다.SQL CE가 유니 코드 값을 변경하는 이유는 무엇입니까?

고유 한 단어가있는 조회 테이블을 만들고 ID 열을 ID 열로 참조합니다. 내가 겪고있는 문제는 유니 코드 (unicode) 인 것 같다.

"정의"라는 용어를 삽입하면 이미 "정의"가있는 행에 대해 고유 한 키 제약 조건이 적용됩니다. 두 사람을 면밀히 살펴보면 내가 삽입하는 값이 'f'와 'i'가 아니라 실제로 하나의 문자라는 사실을 알 수 있습니다. 그러나 SqlCe는이를 'f'및 'i'로 변환하려고합니다. 한 단어는 10 자, 다른 단어는 11 자이지만 SqlCe는이를 동일한 것으로 간주합니다.

테이블 열은 nvarchar입니다.

매개 변수를 nvarchar로 지정했습니다.

쿼리는 매우 간단하다 : 나는 또한 시도했다

  cmd.CommandText = "INSERT INTO dictionary(lemma) VALUES(?);"; 

      DbParameter lemma = cmd.CreateParameter(); 
      cmd.Parameters.Add(lemma); 

      for (int i = 0; i < terms.Count; i++) 
      { 
       lemma.Value = terms[i].Key; 
       cmd.ExecuteNonQuery(); 
      } 

:

  cmd.CommandText = "INSERT INTO dictionary(lemma) VALUES(?);"; 

      SqlCeParameter lemma = new SqlCeParameter("lemma", SqlDbType.NVarChar); 
      cmd.Parameters.Add(lemma); 

      for (int i = 0; i < terms.Count; i++) 
      { 
       lemma.Value = terms[i].Key; 
       cmd.ExecuteNonQuery(); 
      } 

내가 삽입하고있는 무슨에서 '파이'문자에 대한 바이트 (1) (251)이며,로 날엔의 값 반면

{byte[20]} 
[0]: 100 
[1]: 0 
[2]: 101 
[3]: 0 
[4]: 1 
[5]: 251 
[6]: 110 
[7]: 0 
[8]: 105 
[9]: 0 
[10]: 116 
[11]: 0 
[12]: 105 
[13]: 0 
[14]: 111 
[15]: 0 
[16]: 110 
[17]: 0 
[18]: 115 
[19]: 0 

110 0 다음을 참조, 'I'는 105 0 'F'에 대향

{byte[22]} 
[0]: 100 
[1]: 0 
[2]: 101 
[3]: 0 
[4]: 102 
[5]: 0 
[6]: 105 
[7]: 0 
[8]: 110 
[9]: 0 
[10]: 105 
[11]: 0 
[12]: 116 
[13]: 0 
[14]: 105 
[15]: 0 
[16]: 111 
[17]: 0 
[18]: 110 
[19]: 0 
[20]: 115 
[21]: 0 

가 어떻게 제대로 값을 삽입하기 위해 SQL 서버 CE를 얻을 수있다 (하나의 SQLCE는 고유 키의 위반으로보고있다)베이스상의?

편집 : 위에 표시된 코드를 수정했습니다.

+0

nvarchar 데이터 형식입니까? – Holystream

+0

삽입 된 값이 C# 문자열에서옵니다. – McAden

답변

2

SQL의 CE이 값 중 하나를 변경하지 않습니다보십시오. 문제는 열을 고유 한 값만 허용하는 IDENTITY로 정의한 것이고 SQL CE는 데이터 정렬 규칙을 사용하여 VARCHARS의 고유성을 결정한다는 것입니다. 기본값은 문화적으로 인식 가능한 문자열 인 'fi'= 'fi', 'Å'= 'Å'및 기타 여러 문자열과 일치시키는 것입니다.

각 유니 코드 값을 고유 한 것으로 비교하는 SQL 데이터 정렬을 알지 못합니다. 이것이 실제로 원하는 것이라면 데이터를 VarBinary으로 저장하고 이진 비교를 수행해야합니다.

문자를 2 진수로 비교하려는 의도를 재검토하고 SQL은 VarChar을 사람이 읽을 수있는 텍스트로 정의하고 SQL과 유니 코드는 일치하는 합자, 발음 구별 부호 등을 지정합니다. 일치하는 문자열로 이것은 의미가 있으며, 사람들은 실제로 그것들을 똑같이 읽습니다. 그리고 그들은 대부분의 글꼴에서 구별 할 수 없습니다.

+0

SSMS로이 가정을 테스트 한 결과 실제로 Å 및 Å 문자는 동일하게 간주되어 고유 한 NVarChar 열에 허용되지 않습니다. 데이터베이스 로케일을 영어 - 미국에서 일치하는 것으로 변경하면이 규칙이 변경 될 수 있습니다. 고유 한 키로 2 진 데이터에 대해 하나, 원래 문자열 값을 유지하기 위해 두 번째 열을 사용합니다. – SlavaGu

0

for (int i = 0; i < terms.Count; i++) 
{ 
    cmd.CommandText = "INSERT INTO dictionary (lemma) VALUES (@lemma)"; 
    cmd.parameters.AddWithValue(@lemma, lemma);   
    cmd.ExecuteNonQuery(); 
} 
+0

이것은 위에서 본 것과 기본적으로 같습니다. – McAden

관련 문제