SQL服务器 - 限定与UTF-8编码的XML类型列SQL服务器 - 限定与UTF-8编码的XML类

2019-05-12 10:26发布

用于在SQL Server的定义的XML类型字段的默认编码是UTF-16。 我有麻烦插入到该领域使用UTF-16编码XML流。

但是,如果我试图插入使用UTF-8编码的XML流领域,插入的企图会收到错误响应
unable to switch encoding

:是否有一种方法来定义一个SQL Server列/字段具有UTF-8编码?

进一步信息

插入操作使用Spring的JdbcTemplate进行。

通过JAXB的Marshaller产生的XML流设置为UTF-8或UTF-16编码。

private String marshall(myDAO myTao, JAXBEncoding jaxbEncoding)
throws JAXBException{
    JAXBContext jc = JAXBContext.newInstance(ObjectFactory.class);
    m = jc.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    if (jaxbEncoding!=null)
        m.setProperty(Marshaller.JAXB_ENCODING, jaxbEncoding.toString());
    StringWriter strw = new StringWriter();
    m.marshal(myTao, strw);
    String strw.toString();
}

其中...

public enum JAXBEncoding {
    UTF8("UTF-8"),
    UTF16("UTF-16")
    ;

    private String value;
    private JAXBEncoding(String value){
        this.value = value;
    }

    public String toString(){
        return this.value;
    }
}

Answer 1:

有没有一种方法来定义一个SQL Server列/字段具有UTF-8编码?

不,在SQL Server中唯一的Unicode编码是UTF-16小端,这是怎么NCHARNVARCHARNTEXT (不赞成的SQL Server 2005,所以不要在新的开发使用;此外,它吸收相比, NVARCHAR(MAX)反正)和XML数据类型进行处理。 你没有得到Unicode编码的选择像其他一些RDBMS的允许。

您可以将UTF-8编码的XML到SQL Server,只要你遵循以下三个原则:

  1. 传入的字符串必须是数据类型的VARCHAR ,不NVARCHAR (如NVARCHAR总是UTF-16小字节序,因此有关无法切换编码的误差)。
  2. 该XML具有明确规定,XML的编码确实UTF-8 XML声明: <?xml version="1.0" encoding="UTF-8" ?>
  3. 该字节序列必须是实际UTF-8字节。

例如,我们可以导入包含一个UTF-8编码的XML文档尖叫面部表情符号 (和我们可以通过以下该链接这应该是补充字符的UTF-8字节序列):

SET NOCOUNT ON;
DECLARE @XML XML = '<?xml version="1.0" encoding="utf-8"?><root><test>'
                    + CHAR(0xF0) + CHAR(0x9F) + CHAR(0x98) + CHAR(0xB1)
                    + '</test></root>';

SELECT @XML;
PRINT CONVERT(NVARCHAR(MAX), @XML);

返回(在“结果”和“消息”选项卡):

<root><test>