TL; DR
Объедините это: <?xml version="1.0" encoding="windows-1252" ?>
с вашим XML, преобразованным в varchar (max).
Подробнее
Я согласен с j0N45 , что схема ничего не изменит. Как ответ, на который он ссылается указывает:
Вы должны добавить его вручную.
Я предоставил пример кода для этого в другом ответе . По сути, вы CONVERT
XML в varchar
или nvarchar
и затем объединяете его с декларацией XML, такой как <?xml version="1.0" encoding="windows-1252" ?>
.
Однако важно выбрать правильную кодировку. SQL Server генерирует строки, отличные от Юникода, в соответствии со своими параметрами сортировки. По умолчанию это будет регулироваться параметрами сортировки базы данных, которые можно определить с помощью этого SQL:
SELECT DATABASEPROPERTYEX('ExampleDatabaseName', 'Collation');
Стандартное сопоставление по умолчанию - это "SQL_Latin1_General_CP1_CI_AS", кодовая страница которого 1252. Вы можете получить кодовую страницу с помощью этого SQL:
SELECT COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'CodePage') AS 'CodePage';
Для кодовой страницы 1252 следует использовать кодовое имя « windows-1252 ». Использование «ISO-8859-1» является неточным. Вы можете проверить это с помощью символа «bullet»: •. Он имеет значение кодовой точки Unicode 8226 (Hex 2022). Вы можете надежно сгенерировать символ в SQL независимо от параметров сортировки, используя этот код:
SELECT NCHAR(8226);
У него также есть кодовая точка 149 в кодовой странице windows-1252, поэтому, если вы используете стандартное сопоставление по умолчанию «SQL_Latin1_General_CP1_CI_AS», вы также можете создать его с помощью:
SELECT CHAR(149);
Однако CHAR (149) не будет пулей во всех сопоставлениях. Например, если вы попробуете это:
SELECT CONVERT(char(1),char(149)) COLLATE Chinese_Hong_Kong_Stroke_90_BIN;
Вы вообще не получите пулю.
Кодовая страница ISO-8859-1 - Windows-28591 . Ни одно из сопоставлений SQL Server (в любом случае в 2005 году) не использует эту кодовую страницу. Вы можете получить полный список кодовых страниц, используя:
SELECT [Name], [Description], [CodePage] = COLLATIONPROPERTY([Name], 'CodePage')
FROM ::fn_helpcollations()
ORDER BY [CodePage] DESC;
Вы также можете проверить, что «ISO-8859-1» является неправильным выбором, попытавшись использовать его в самом SQL. Следующий SQL:
SELECT CONVERT(xml,'<?xml version="1.0" encoding="ISO-8859-1"?><test>•</test>');
Будет генерировать XML, который не содержит маркера. На самом деле, он не будет производить никаких символов, потому что ISO-8859-1 не имеет символов, определенных для кодовой точки 149.
SQL Server по-разному обрабатывает строки Unicode. Для строк Unicode (nvarchar
), «нет необходимости в разных кодовых страницах для обработки разных наборов символов» . Однако SQL Server НЕ использует кодировку «UTF-8». Если вы попытаетесь использовать его внутри самого SQL:
SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UTF-8"?><test>•</test>');
Вы получите ошибку:
Сообщение 9402, уровень 16, состояние 1, строка 1 Синтаксический анализ XML: строка 1, символ 38,
невозможно переключить кодировку
Скорее, SQL использует кодировку "UCS-2", так что это будет работать:
SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UCS-2"?><test>•</test>');