001*_*ank 20 xml sql-server utf-8 character-encoding sql-server-2008
可能是未答复的副本. SQL Server 2008 - 将XML声明添加到XML输出
如果可能,请告诉我.我在一些博客中读到过
http://forums.asp.net/t/1455808.aspx/1
http://www.devnewsgroups.net/group/microsoft.public.sqlserver.xml/topic60022.aspx
但我无法理解为什么我不能这样做.
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)
“手动添加”的公认答案虽然在技术上是正确的,但并不完整,因此具有误导性。简单地添加带有任何您想要的“编码”的 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="😎"/>';
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仅在完整(付费)版本中可用。
| 归档时间: |
|
| 查看次数: |
58148 次 |
| 最近记录: |