我遇到编码问题。我想将UTF-8编码文件中的数据放入SQL Server 2008数据库。 SQL Server仅具有UCS-2编码功能,因此我决定显式转换检索到的数据。
// connect to page file
_fsPage = new FileStream(mySettings.filePage, FileMode.Open, FileAccess.Read);
_streamPage = new StreamReader(_fsPage, System.Text.Encoding.UTF8);
以下是数据的转换例程:
private string ConvertTitle(string title)
{
string utf8_String = Regex.Replace(Regex.Replace(title, @"\\.", _myEvaluator), @"(?<=[^\\])_", " ");
byte[] utf8_bytes = System.Text.Encoding.UTF8.GetBytes(utf8_String);
byte[] ucs2_bytes = System.Text.Encoding.Convert(System.Text.Encoding.UTF8, System.Text.Encoding.Unicode, utf8_bytes);
string ucs2_String = System.Text.Encoding.Unicode.GetString(ucs2_bytes);
return ucs2_String;
}
当单步执行关键标题的代码时,变量监视会显示utf-8和ucs-2字符串的正确字符。但在数据库中它 - 部分错误。有些特殊字符可以正确保存,有些则不能保存。
知道问题可能在哪里以及如何解决?
提前吃, 弗兰克
答案 0 :(得分:11)
SQL server 2008为您处理从UTF-8到UCS-2的转换。
首先确保您的SQL表使用列的nchar,nvarchar数据类型。然后,您需要通过在编码字符串前添加N来告诉SQL Server您在Unicode数据中的发送。
INSERT INTO tblTest (test) VALUES (N'EncodedString')
来自Microsoft http://support.microsoft.com/kb/239530
请在此处查看我的问题和解决方案:How do I convert UTF-8 data from Classic asp Form post to UCS-2 for inserting into SQL Server 2008 r2?
答案 1 :(得分:6)
我认为你对编码是什么有误解。编码用于将一堆字节转换为字符串。 String本身没有与之关联的编码。
在内部,字符串以UTF-16LE字节存储在内存中(这就是为什么Windows通过调用UTF-16LE编码只是“Unicode”而使每个人感到困惑的原因)。但你不需要知道 - 对你来说,它们只是一串字符。
你的功能是:
所以这个功能是多余的;实际上你可以从.NET传递一个普通的String到SQL Server而不用担心它。
带反斜杠的位确实做了一些事情,大概是应用程序特定的我不明白它的用途。但是,该功能中的任何内容都不会导致Windows将字符平移为ñ到n。
当您尝试将不在数据库自身编码中的字符放入数据库时,会出现什么/将会导致这种展平。大概é是可以的,因为这个字符是你的西欧cp1252的默认编码,但不是这样它会被破坏。
SQL Server确实使用'UCS2'(再次真的是UTF-16LE)来存储Unicode字符串,但是你已经告诉它,通常使用NATIONAL CHARACTER(NCHAR / NVARCHAR)列类型而不是普通的CHAR。
答案 2 :(得分:3)
我们对编码也非常困惑。 Here is an useful page that explains it. 另外,回答以下问题也有助于解释它 -
答案 3 :(得分:0)
对于使用较新版本的未来读者,请注意SQL Server 2016在其bcp实用程序中支持UTF-8。