gbn*_*gbn 37

您必须手动添加它.SQL Server始终在内部将xml存储为ucs-2,因此SQL无法生成utf-8编码头

请参阅MSDN上的"xml数据类型的限制"

例如,<?xml version='1.0'?>在xml数据类型实例中存储XML数据时,不会保留XML声明PI .这是设计的.<?xml ... ?>数据转换为xml类型后,XML声明()及其属性(版本/编码/独立)将丢失.XML声明被视为XML解析器的指令.XML数据在内部存储为ucs-2.


小智 5

当我读到这篇文章时,我认为这是"行的结束"......没有解决方案......我几乎放弃了这种方法......但实际上有一种方法可以通过转换XML来解决这个限制到varchar(max)然后将声明附加到字符串的开头.以下文章说明了如何:

使用SQL Server"FOR XML":将结果数据类型转换为Text/varchar/string是什么?

一个简单的例子看起来像这样:

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 
Run Code Online (Sandbox Code Playgroud)

输出:

<?xml version="1.0" encoding="UTF-8"?>
<MyColumn>MY DATA</MyColumn>
Run Code Online (Sandbox Code Playgroud)

  • 仅使用UTF-8并不准确.如果您有Unicode字符串,请改用UCS-2.有关详细信息,请参阅[相关问题](http://stackoverflow.com/q/6215069/2266979)上的[我的回答](http://stackoverflow.com/a/23207366/2266979).如果你有一个普通的varchar字符串,那么使用"windows-1252". (2认同)
  • 这将使数据类型为varchar而不是xml (2认同)

Sol*_*zky 5

“手动添加”的公认答案虽然在技术上是正确的,但并不完整,因此具有误导性。简单地添加带有任何您想要的“编码”的 XML 声明不会改变字符串的实际编码。这有时没问题。如果您指定“UTF-8”并将XML数据转换为VARCHAR,那么只要所有字符都是标准 ASCII 字符(值 1 - 127),那么肯定是 UTF-8(至少没有明显区别)。但是,如果有任何值为 128 或以上的字符,那么您就没有UTF-8 编码的 XML 文档。如果您将 XML 数据转换为NVARCHAR,那么您就有了一个 UTF-16 编码的文档,无论您在 XML 声明中手动指定了什么。您应该只指定编码,如果它是正在使用的实际编码。

在 SQL Server 2019(目前处于 CTP 2.1 测试版)之前,无法在 SQL Server 中将编码设为 UTF-8,至少在不使用 SQLCLR 的情况下无法实现。但是在 SQL Server 2019 中,您现在可以将 XML 转换为实际的 UTF-8:

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
Run Code Online (Sandbox Code Playgroud)

那返回:

Column 1: <test attr="" />
Column 2: 0x3C007400650073007400200061007400740072003D0022003DD80EDE22002F003E00
Column 3: 0x3C7465737420617474723D223F3F222F3E
Run Code Online (Sandbox Code Playgroud)

由于很多人暂时不会使用 SQL Server 2019,因此可以通过 SQLCLR 实现。您可以使用 .NET Xml 类(例如XmlWriter)通过各种选项导出它。事实上,我创建了一个 SQLCLR 函数库SQL#,其中包括这样一个函数:XML_SaveToFile。该XML_SaveToFile功能允许指定任何有效编码,它都将集于XML声明,并确保该文件保存与编码。它还具有缩进、换行等选项。仅供参考:虽然免费版本中有许多功能可用,但XML_SaveToFile仅在完整(付费)版本中可用。