2011-02-15 48 views
1

我從各種來源獲取各種文檔的非結構化文本。我正在使用Sql Server Compact Edition 3.5。爲什麼Sql CE會改變我的unicode值?

我創建了一個帶有唯一字的查找表,並通過一個ID引用它們作爲標識列。我發現問題似乎是unicode。

插入術語「定義」後,我對已經具有「定義」的行執行唯一鍵約束。如果仔細檢查兩者,你會發現我插入的值不是'f'和'i',而是單個字符。然而,SqlCe試圖將它轉換爲「f」和「i」。一個字中有十個字符,另一個字符中有十個字符,但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,如反對 'f' 和 'i' 的105 0,110 0 參見以下:

{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 

而值在DAT ABASE(一個SQLCE被看到,因爲違反唯一鍵的)是:

{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 Server CE正確地將價值?

編輯:更正了上面顯示的代碼。

+0

它是nvarchar數據類型嗎? – Holystream 2011-02-15 23:00:23

+0

插入的值來自C#字符串 – McAden 2011-02-15 23:18:22

回答

2

SQL CE沒有任何改變你的價值觀。問題是你已經將列定義爲IDENTITY,它只允許唯一值,而SQL CE通過使用排序規則來確定VARCHARS的唯一性。缺省是匹配文化意識的字符串,所以'fi'='fi','Å'='Å'等等。

我不知道任何SQL排序規則將每個Unicode值作爲不同的值進行比較。如果這真的是你想要的,你將不得不將數據存儲爲VarBinary並執行二進制比較。

重新考慮您希望將字符比作二進制,SQL將VarChar定義爲人類可讀的文本,並且SQL和Unicode都指定相應的連字,變音符等。作爲匹配字符串。這是有道理的,人們確實會閱讀它們,而且在大多數字體中它們是無法區分的。

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 2011-02-15 23:54:36

相關問題