Самый важный вопрос: зачем вам декларация?
Важно знать: эта декларация не является обязательной частью XML, но подсказывает потребителю, как читать контент .
В большинстве случаев это объявление сообщает потребителю о кодировке текстового файла. Существуют миллионы XML файлов, которые выкрикивают encoding="utf8"
или что-то в этом роде, но на самом деле это файл utf16
, обычный ASCII или любая другая кодировка. Если декларация не говорит правду, лучше вообще не иметь такой декларации ...
В пределах SQL -Сервер есть три варианта хранения XML (не говоря уже о * 1009). * или устаревший text
здесь): Лучшее - native XML
, в котором используется скрытая таблица иерархии nvarchar
, и (неправильный выбор, но) часто встречающийся столбец на основе строки, основанный на одной из двух строк типы. Вы должны знать, что SQL -Server может иметь дело с (var)char(x)
(что является расширенной сортировкой ASCII ), и с n(var)char(x)
, который является UCS-2
(почти таким же, как utf16
) ,
Какая польза от хранения XML с объявлением в таком сценарии? SQL -Сервер может принимать кодировку непосредственно от типа, используемого для хранения. На уровне строк вы можете хранить буквально все что угодно, даже недопустимое / не правильно сформированное XML. Но в тот момент, когда вы вводите тип native XML, SQL -Server пропустит любое объявление и откажется от нарушения правил XML.
Для ответа на ваш вопрос
Единственный шанс добавить объявление, если оно вам действительно нужно, - преобразовать XML в строковый тип и добавить объявление на строковом уровне.
Имейте в виду, что
- вы не можете перенести это обратно в native XML без потери объявления.
- Если вы указали какую-либо кодировку, вы должны убедиться, что записанный целевой файл не является лжец.
Несколько лет go У меня возник тот же вопрос (нужно было добавить подсказку таблицы стилей). Вы можете прочитать этот связанный вопрос (и хороший ответ от har07) . Мой собственный ответ там отражает конкретно <?xml blahblah ?>
.
заключительные подсказки
Начиная с с v2019 есть встроенная поддержка utf-8
с некоторыми специальными параметрами сортировки и начиная с v2014SP2 была поддержка UTF-8 для BCP .
. Вы можете использовать этот код, чтобы найти кодировку сортировки:
select [name]
,[description]
,COLLATIONPROPERTY([name],'codepage') [codepage]
from sys.fn_helpcollations();
И - после этого - вы можете использовать что-то вроде this
<?xml version="1.0" encoding="windows-1252"?>
Для правильного отображения выбранной кодировки.
Общая подсказка: Использование строкового типа NVARCHAR(MAX)
вместе с utf-16
работает (почти) в любом случае.