Принятый ответ «добавить его вручную», хотя технически правильный, неполон и, следовательно, вводит в заблуждение. Простое добавление объявления XML с любой «кодировкой», которую вы хотите, не меняет фактическую кодировку строки. Это иногда хорошо. Если указать «UTF-8» и преобразовать данные XML
в VARCHAR
, тогда, если все символов являются стандартными символами ASCII (значения 1–127), то, конечно же, это UTF -8 (по крайней мере, заметной разницы нет). НО, если есть любые символов со значениями 128 или выше, то у вас не есть XML-документ в кодировке UTF-8. А если вы преобразуете данные XML в NVARCHAR
, то у вас будет документ в кодировке UTF-16, независимо от того, что вы вручную указали в объявлении XML. Вы должны указывать только кодировку, ЕСЛИ это фактическая используемая кодировка.
И до SQL Server 2019 (в настоящее время в бета-версии на CTP 2.1) не было никакого способа получить кодировку UTF-8 в SQL Server, по крайней мере, без использования SQLCLR. Но в SQL Server 2019 теперь вы можете конвертировать XML в фактический UTF-8:
DECLARE @XML XML;
SET @XML = N'<test attr="😎"/>';
SELECT @XML,
CONVERT(VARBINARY(100), CONVERT(NVARCHAR(MAX), @XML)), -- UTF-16 / UCS-2
CONVERT(VARBINARY(100),
CONVERT(VARCHAR(MAX),
CONVERT(NVARCHAR(MAX), @XML) COLLATE Latin1_General_100_CI_AS_SC_UTF8)
); -- UTF-8
Возвращает:
Column 1: <test attr="?" />
Column 2: 0x3C007400650073007400200061007400740072003D0022003DD80EDE22002F003E00
Column 3: 0x3C7465737420617474723D223F3F222F3E
Поскольку многие люди еще не будут на SQL Server 2019 некоторое время, это возможно через SQLCLR. Вы можете использовать классы .NET Xml (например, XmlWriter
), чтобы экспортировать их с различными вариантами. Фактически, я создал библиотеку функций SQLCLR, SQL # , которая включает такую функцию: XML_SaveToFile . Функция XML_SaveToFile позволяет указать любую допустимую кодировку, и она одновременно задает это в объявлении XML и обеспечивает сохранение файла с этой кодировкой. У него также есть опции для отступов, перехода на новую строку и т. Д. Просто к сведению: хотя в бесплатной версии доступно много функций, XML_SaveToFile доступен только в полной (платной) версии.