utf8_general_ci utf8 convert collations sql-server xml sql-server-2008 utf-8 character-encoding

utf8 - Cómo agregar la codificación xml<? Xml version=“1.0” encoding=“UTF-8”?> A la salida xml en SQL Server



sql server utf-8 convert (4)

Probablemente un duplicado de sin respuesta. SQL Server 2008 - Añadir declaración XML a salida XML

Por favor, hágamelo saber si esto es posible. Yo leo en algunos blogs

http://forums.asp.net/t/1455808.aspx/1

http://www.devnewsgroups.net/group/microsoft.public.sqlserver.xml/topic60022.aspx

Pero no pude entender por qué no puedo hacer esto.


Cuando leí este post, pensé que era el "final de la línea" ... no hay solución ... casi renuncié al enfoque ... pero de hecho, hay una manera de evitar esta limitación al convertir el XML a varchar (max) y luego anexando la declaración al principio de la cadena. La siguiente publicación muestra cómo:

Usando SQL Server "FOR XML": ¿Convertir el tipo de datos del resultado a texto / varchar / string?

Un ejemplo simple se vería así:

SELECT ''MY DATA'' As MyColumn INTO #MyTable SELECT ''<?xml version="1.0" encoding="UTF-8"?>'' + CAST((SELECT MyColumn FROM #MyTable FOR XML PATH('''')) AS VARCHAR(MAX)) AS XmlData DROP TABLE #MyTable

La salida:

<?xml version="1.0" encoding="UTF-8"?> <MyColumn>MY DATA</MyColumn>


He estado trabajando con este asunto durante los últimos días, y aunque podría haber mejores soluciones, he terminado bastante satisfecho con este script de bash:

iconv -f UCS-2 -t UTF-8 products.xml > products_utf8.xml echo "<?xml version=''1.0''?>/n<products>/n$(cat products_utf8.xml)/n</products>" > products_utf8_final.xml

Básicamente, este script obtendrá un archivo generado por el horrible software bcp, que genera datos XML incompletos e inválidos, lo convierte del formato UCS-2 a UTF-8 (primera fila) y lo agrega al principio y al final del archivo lo que necesita (segunda fila del script) para ser válido y completo.

Esto funciona para mi. El script que utilicé para generar el archivo XML con BCP es:

bcp.exe "select * from dat1.dbo.Products FOR XML AUTO,ELEMENTS” queryout "C:/products.xml" -T -w -r -S ./SQLEXPRESS


La respuesta aceptada de "agregarlo manualmente", aunque técnicamente correcta, es incompleta y, por lo tanto, engañosa. El simple hecho de agregar la declaración XML con la "codificación" que desee no cambia la codificación real de la cadena. Esto a veces está bien. Si especifica "UTF-8" y convierte los datos XML a VARCHAR , entonces, mientras todos los caracteres sean caracteres ASCII estándar (valores 1 a 127), entonces es seguro, es UTF-8 (al menos no hay una diferencia notable ). PERO, si hay caracteres con valores 128 o superiores, entonces no tiene un documento XML codificado en UTF-8. Y si convierte los datos XML a NVARCHAR , entonces tiene un documento codificado en UTF-16, independientemente de lo que especifique manualmente en la declaración XML. Solo debe especificar una codificación SI es la codificación real que se está utilizando.

Y hasta SQL Server 2019 (actualmente en versión beta en CTP 2.1), no había forma de que la codificación fuera UTF-8 dentro de SQL Server, al menos no sin usar SQLCLR. Pero en SQL Server 2019, ahora puede convertir el XML a UTF-8 real:

DECLARE @XML XML; SET @XML = N''<test attr="&#x1F60E;"/>''; 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

Eso devuelve:

Column 1: <test attr="😎" /> Column 2: 0x3C007400650073007400200061007400740072003D0022003DD80EDE22002F003E00 Column 3: 0x3C7465737420617474723D223F3F222F3E

Como muchas personas no estarán en SQL Server 2019 por un tiempo, esto es posible a través de SQLCLR. Puede usar las clases .NET Xml (por ejemplo, XmlWriter ) para exportar esto con varias opciones. De hecho, creé una biblioteca de funciones SQLCLR, SQL# , que incluye dicha función: XML_SaveToFile . La función XML_SaveToFile permite especificar cualquier codificación válida y establecerá eso en la declaración XML y garantizará que el archivo se guarde con esa codificación. También tiene opciones para sangría, nuevas líneas, etc. Solo para su información: si bien hay muchas funciones disponibles en la versión gratuita, XML_SaveToFile solo está disponible en la versión completa (de pago).


Tienes que añadirlo manualmente. SQL Server siempre almacena xml internamente como ucs-2, por lo que es imposible que SQL genere un encabezado de codificación utf-8

Consulte "Limitaciones del tipo de datos xml" en MSDN.

La declaración XML PI, por ejemplo, <?xml version=''1.0''?> , No se conserva cuando se almacenan datos XML en una instancia de tipo de datos xml. Esto es por diseño. La declaración XML ( <?xml ... ?> ) Y sus atributos (versión / codificación / independiente) se pierden una vez que los datos se convierten al tipo xml. La declaración XML se trata como una directiva para el analizador XML. Los datos XML se almacenan internamente como ucs-2.