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

相关问题