2013-06-03 3 views
4

У меня есть приложение, которое получает XML из некоторой веб-службы, написанной на PHP, и вставляет ее в базу данных SQL Server. Когда я пытаюсь вставить принятый XML, который содержит польские диакритические символы, я получаю сообщение об ошибке, как это:Преобразование UTF8 в uTF16 в SQL Server

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 типа.

Я гугле найти какое-то решение, и я нашел UTF8String: http://msdn.microsoft.com/en-us/library/ms160893(v=sql.90).aspx

Я установил его, и пытался преобразовать XML в UTF8String, а затем преобразовать его снова в нормальный varchar, а затем XML, и вставить его в моя таблица, но похоже, что она не меняет никаких символов внутри этого XML, она просто меняет тип переменной и не решает мою проблему.

Я также нашел совет какого-то парня, что можно решить подобную проблему, написав процедуру, которая проходит цикл для каждого символа в переменной (XML в моем случае) и вручную меняет ее кодировку, но этот парень также сказал, что может работа медленная. Это действительно единственный способ решить мою проблему?

ответ

2

Try приведение к 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 = ЗАМЕНИТЬ (@ xmlstr, 'кодирование = "UTF-8"', '') ; , потому что, не удаляя объявление кодировки из заголовка XML, он сказал: Анализ XML: строка 1, символ 38, не удалось переключить кодировку Благодарим за помощь – Konrad

+0

Просьба предоставить образец кода XML. – Devart

+0

@ Konrad Лучше заменить 'UTF-8' на' UTF-16': 'REPLACE (@xmlstr, 'encoding =" UTF-8 "', 'encoding =" UTF-16 "')', так как это * is * utf-16 закодирован (это то, что означает ведущий символ N). –

1

для файла XML, UTF-16 не поддерживается SQL Server 2008 R2, поэтому для файла XML, который начинается с

, когда вы разбираете это xml дает ошибку

Msg 6602, уровень 16, состояние 2, процедура sp_xml_preparedocument, строка 1 Описание ошибки: «Переход от текущей кодировки к указанной кодировке не поддерживается».

разрешить вышеуказанную ошибку простой шаг заключается в использовании SQL заменить функцию

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

Я работал над 3 процедурами, используя xml-файл, всякий раз, когда я пытался использовать парсер PHP utf-16, вы получаете ошибку.

Всегда используйте UTF-8 для сервера SQL 2008 R2

Смежные вопросы