2012-01-30 97 views
2

Im根据某些参数将Outlook加载项写入文件电子邮件。C#在SQL Server中存储文本以进行全文搜索

我正在将Outlook.MailItem.Body属性存储在SQL Server 2008R2的varbinary(max)字段中。我也在这一栏中启用了FTS。

目前我将电子邮件的Body属性作为字节数组存储在数据库中,并使用ASCIIEncoder.GetBytes()函数来转换此明文。目前我正在经历一些奇怪的结果,因此我偶尔会注意到字符?的撇号和新行。

我有两个问题:

  1. 这是存储在数据库中的文本的最佳方法是什么?作为一个字节数组? ASCIIEncoder是实现这一目标的最佳方法吗?
  2. 我想正确处理Unicode字符串,有什么我应该知道的?

回答

2

我不确定FullTextSearch在VarBinary列上的效果是否最好,尽管我的本能说“不”,但我可以回答你的问题的后半部分。

您得到奇数字符的原因是,ASCIIEncoder.GetBytes()将文本视为ASCII,并且如果您正在编码的文本不是ASCII编码的,则可能会出现这些错误。默认情况下,.NET中的字符串是UTF8,所以你可能会遇到问题。使用Encoding.UTF8.GetBytes()获取UTF8字符串的字节。

这也回答了第二个问题 - 这种方法对Unicode字符串有用吗?是的,因为你根本不存储字符串。您正在存储字节,应用程序碰巧知道这些字节是编码的Unicode字符串。 SQL不会对它们做任何事情,因为它们只是字节。

+0

感谢关于varbinary的额外信息,我在辩论哪条路要走。 – Simon 2012-01-30 13:53:57

2

由于您必须支持Unicode字符并只处理文本,因此您应将数据存储在nvarchar类型的列中。这将同时解决你的问题:

1)文本在数据库中保存的可变长度Unicode字符数据,你并不需要一个字节编码器/解码器来检索数据

2)请参阅1.)

+0

我有一种感觉,使用varbinary的原始决定是支持HTML文本,但是我不再关心HTML,并且希望只存储纯文本表示。我可能只是试一试 – Simon 2012-01-30 13:59:22

+0

这个解决方案将允许存储HTML文本,即使你不需要它。 – EBarr 2012-01-30 14:01:07