在SQL Server中将UTF8转换为UTF16

4
我有一个应用程序,从一些用PHP编写的Web服务接收XML并将其插入到SQL Server数据库中。当我尝试插入包含波兰变音字符的接收到的XML时,会出现以下错误:

XML解析:第2行,第703个字符,非法的xml字符

我尝试做这样的事情:

DECLARE @xml XML;
SET @xml = '(here I paste some sample XML that contains diacritical characters)';
SELECT @xml = CAST(@xmlstr AS XML);
INSERT INTO vos_DirectXML_ut(ValidXML,synchronization_time,synchronization_type,MethodName)
VALUES(@xml,GETDATE(),@SynchroType,@method);

ValidXML 是一个 XML 类型的列。

我通过 Google 找到了一些解决方案,发现了 Utf8String: http://msdn.microsoft.com/en-us/library/ms160893(v=sql.90).aspx

我安装了它,并尝试将 XML 转换为 Utf8String,然后再将其转换回普通的 varchar,最后转换为 XML 并插入到我的表中,但看起来它没有改变 XML 内部的任何字符,它只是改变了变量的类型,这并没有解决我的问题。

我还发现有人提出了一种解决类似问题的建议,即编写一个过程,循环遍历变量中的每个字符(在我的情况下是 XML)并手动更改其编码,但这位大佬还说这可能会工作缓慢。这真的是解决我的问题的唯一选择吗?

2个回答

2
尝试转换为UNICODE:
DECLARE @xmlstr NVARCHAR(MAX) --<--
SELECT @xmlstr = N'(some sample XML that contains diacritical characters)'; --<-- N''

DECLARE @xml XML
SELECT @xml = CAST(@xmlstr AS XML)

INSERT INTO dbo.vos_DirectXML_ut
( 
      ValidXML
    , synchronization_time 
    , synchronization_type 
    , MethodName
)
SELECT 
      @xml 
    , GETDATE() 
    , @SynchroType 
    , @method

虽然有所帮助,但我不得不添加以下代码行: SET @xmlstr = REPLACE(@xmlstr,'encoding="UTF-8"',''); 因为如果不删除 XML 头中的编码声明,就会显示以下错误信息: XML parsing: line 1, character 38, unable to switch the encoding 谢谢您的帮助。 - Konrad
@Konrad 最好将 UTF-8 替换为 UTF-16: REPLACE(@xmlstr, 'encoding="UTF-8"', 'encoding="UTF-16"'),因为它确实是 utf-16 编码的(这就是前导的 N 的含义)。 - Ian Boyd

1
对于XML文件,SQL Server 2008 R2不支持UTF-16编码。因此,如果XML文件以

开头,则解析该XML会出现错误。
错误消息为:Msg 6602,Level 16,State 2,Procedure sp_xml_preparedocument,Line 1。错误描述为“从当前编码切换到指定编码不受支持”。
为了解决上述错误,简单的步骤是使用SQL replace函数。
REPLACE('@xmldata','utf-16','')或REPLACE('@xmldata','utf-16','utf-8')
我已经使用XML文件工作过3个程序,每当我尝试使用utf-16 XML解析器时都会出现错误。
始终在SQL Server 2008 R2中使用utf-8。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接