2013-06-03 156 views
4

我有一個應用程序從PHP中編寫的某些Web服務接收XML,並將其插入到SQL Server數據庫中。當我嘗試插入包含波蘭的變音字符接收XML,我得到這樣的錯誤:在SQL Server中將UTF8轉換爲uTF16

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); 

ValidXMLXML類型列。

我用Google搜索找到了一些解決方案,我發現UTF8字符串: http://msdn.microsoft.com/en-us/library/ms160893(v=sql.90).aspx

我安裝了它,並試圖XML轉換爲UTF8字符串,然後再次將其轉換爲正常varchar,然後XML,並將其插入到我的表,但看起來它不會更改此XML內的任何字符,它只是改變了變量的類型,並沒有解決我的問題。

我還發現了一些人的建議,可以通過編寫一個程序來處理變量中的每個字符(我的情況是XML)並手動更改它的編碼來解決類似的問題,但是這個人也說可能工作緩慢。這真的是解決我的問題的唯一選擇嗎?

回答

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 
+0

它幫助,雖然我不得不添加一行: SET @xmlstr = REPLACE(@ xmlstr, '編碼= 「UTF-8」', '') ; 因爲沒有從XML頭去除聲明編碼,它說: XML解析:行1,字符38,無法切換編碼 感謝您的幫助 – Konrad

+0

請提供您的代碼示例與XML。 – Devart

+0

@Konrad因爲它會更好地用UTF-16替換UTF-8:REPLACE(@xmlstr,'encoding =「UTF-8」','encoding =「UTF-16」') *是* utf-16編碼(這就是領先的'N'的意思)。 –

1

爲XML文件,UTF-16不是由SQL Server 2008 R2的支持,因此爲XML文件,這是與

啓動時你分析這個xml給出錯誤

消息6602,級別16,狀態2,過程sp_xml_preparedocument,行1 錯誤描述爲'從當前編碼切換到不支持指定編碼'。

解決上述錯誤的簡單的步驟是使用SQL替換功能

REPLACE( '@ XMLDATA', 'UTF-16', '')或REPLACE( '@ XMLDATA','UTF- 16','utf-8')

我一直在使用xml文件處理3個過程,每當我嘗試使用utf-16 XML解析器都會給出錯誤。

始終使用UTF-8爲SQL Server 2008 R2