SQL 服务器在转换为 XML 时是否添加字节顺序标记?

Does SQL Server add a byte order mark when casting to XML?

我有这个 C# 方法,用于在序列化为 XML:

时忽略字节顺序标记
public static string SerializeAsXml(this object dataToSerialize)
{
   if (dataToSerialize == null) return null;

   using (var stringwriter = new StringWriter())
   {
      var serializer = new XmlSerializer(dataToSerialize.GetType());

      serializer.Serialize(stringwriter, dataToSerialize);

      var xml = stringwriter.ToString();

      var utf8 = new UTF8Encoding(false);

      var bytes = utf8.GetBytes(xml);

      xml = utf8.GetString(bytes);

      return xml;
   }
}

结果被传递给存储过程并像这样转换为 XML:@EventMessage AS XML

此存储过程将此作为消息添加到服务代理队列中。

但是,在测试时,从队列中检索 BOM 时仍然存在。

SQL服务器在投射时会自己添加BOM吗?就这样,有什么办法可以避免吗?

编辑:

我在健身测试中使用此查询从队列中检索值:

var sqlSelectCommand =
            $@"SELECT message_type_name, message_body, casted_message_body = 
            CASE message_type_name WHEN 'X' 
              THEN CAST(message_body AS NVARCHAR(MAX)) 
              ELSE message_body 
            END 
            FROM {QueueName} WITH (NOLOCK)";

这是这样读的:

var castedMessageBody = reader["casted_message_body"].ToString();

而且我知道 BOM 仍然存在,因为测试需要它通过:

   if (castedMessageBody.StartsWith(_byteOrderMarkUtf8, StringComparison.Ordinal))
   {
       castedMessageBody = castedMessageBody.Remove(0, _byteOrderMarkUtf8.Length);
   }

从技术上讲,我认为它在转换为 XML since:

时不会添加 BOM

The data is stored in an internal representation that preserves the XML content of the data. This internal representation includes information about the containment hierarchy, document order, and element and attribute values. Specifically, the InfoSet content of the XML data is preserved

由于 BOM 是 XML 的 字符串编码 而不是 XML 信息集的一部分,我认为 BOM 不是已存储。

但是,如果您将 XML 数据转换为 SQL 服务器中的二进制或字符串表示形式,它似乎更喜欢 UTF-16 编码以 BOM 作为您收到的表示。