gpt4 book ai didi

sql-server - SQL Server - 使用 UTF-8 编码定义 XML 类型的列

转载 作者:数据小太阳 更新时间:2023-10-29 02:00:42 26 4
gpt4 key购买 nike

SQL Server 中定义的 XML 类型字段的默认编码是 UTF-16。我可以毫不费力地将 UTF-16 编码的 XML 流插入该字段。

但是如果我尝试插入到具有 UTF-8 编码的 XML 流的字段中,插入尝试将收到错误响应
无法切换编码

问题:有没有办法将 SQL Server 列/字段定义为具有 UTF-8 编码?

更多信息

插入操作使用 Spring JDBCTemplate 执行。

XML 流由设置为 UTF-8 或 UTF-16 编码的 JAXB 编码器生成。

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;
}
}

最佳答案

Is there a way to define a SQL Server column/field as having UTF-8 encoding?

不,SQL Server 中唯一的 Unicode 编码是 UTF-16 Little Endian,这就是 NCHAR , NVARCHAR , NTEXT (自 SQL Server 2005 起已弃用,因此不要在新开发中使用它;此外,与 NVARCHAR(MAX) 相比,它很糟糕)和 XML处理数据类型。您无法像其他 RDBMS 允许的那样选择 Unicode 编码。

只要遵循以下三个规则,您就可以将 UTF-8 编码的 XML 插入到 SQL Server 中:

  1. 传入的字符串必须是数据类型 VARCHAR , 不是 NVARCHAR (因为 NVARCHAR 始终是 UTF-16 Little Endian,因此出现无法切换编码的错误)。
  2. XML 有一个 XML 声明,明确声明 XML 的编码确实是 UTF-8:<?xml version="1.0" encoding="UTF-8" ?> .
  3. 字节序列需要是实际的 UTF-8 字节。

例如,我们可以导入包含 screaming face emoji 的 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>😱</test></root>

您在对@Shnugo 的回答的评论中提到:

I've had no problems inserting utf-8 encoded streams with utf-8 header into SQL Server 2013 NVARCHAR column. Would there be a hidden problem?

不,您没有在 NVARCHAR 中存储 UTF-8 编码的任何内容列(此外,没有 2013 版本的 SQL Server,但这可能只是一个错字)。 NVARCHAR只有 UTF-16 Little Endian。您的 UTF-8 流很可能在传输到 SQL Server 的过程中被数据库驱动程序转换为 UTF-16 LE。这与 XML 列使用的编码相同,但 XML 列会尝试将流从 UTF-8 转换为 UTF-16,但由于它已经是 UTF-16 而失败。这也意味着在退出 SQL Server 的途中,XML 文档存储在 NVARCHAR 中。列仍然会有 XML 声明,说明编码是 UTF-8,但它绝对不是 UTF-8。

如果您绝对需要数据在输出时为 UTF-8,因为您不想转换来自 SQL Server 的 UTF-16 LE XMLNVARCHAR转换为 UTF-8,那么您别无选择,只能将数据存储为 VARBINARY(MAX) .

关于sql-server - SQL Server - 使用 UTF-8 编码定义 XML 类型的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41494856/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com