在 Java 中加载 UTF-8 编码的 XML 数据时出现数据库错误

Database error while loading UTF-8 Encoded XML Data in Java

我正在考虑在这里集思广益我的问题,不确定这是否会触发大量关机!

简化:我有一个读取 XML 文件并将其加载到数据库中的系统。

XML 的架构如下:

<?XML version="1.0" encoding="UTF-8"?>

罪魁祸首字段具有以下架构摘录:

<xsd:simpleType name="title">
.....
<xsd:restriction base="xsd:string">
 <xsd:minLength value="1"/>
 <xsd:maxLength value="2000"/>
</xsd:restriction>

架构符合 UTF-8 标准,因此应该支持 2000 个 UTF-8 字符,无论它们是单个字节还是 double-byte 或多个字节。

XML 模式已经进行了字符长度检查,如上面摘录中所定义。

问题是 有时 XSD 验证成功,但数据库插入失败,当某些 multi-byte UTF-8 时服务器因数据库错误而崩溃字符出现在 'title' XML 字段中。

The database 'title' column is defined as `varchar(2000)`

当数据库插入操作失败时,ops需要手动减少XML字段和re-processXML文件的长度来修复

我一直在研究:

解决方案是否可以执行与字符数匹配的字符串字节数检查?

我可以在 Java 中执行 string.getBytes("UTF-8").length,但是如何匹配 XSD 中的 <xsd:maxLength value="2000"/>varchar(2000)?

您建议什么是确保标题字段的 XML 数据不超过指定长度的最佳方法,如 XSD 中所定义。并且只要符合XSD,XML数据就成功插入到DB中了?

我假设 XSD 中的 <xsd:maxLength value="2000"/>varchar(2000) 列定义匹配吗?

The schema is UTF-8 compliant

不完全是,但我想我明白你的意思。您引用的 XML 声明未指定任何有关与此架构匹配的 XML 实例文档的信息。它只是说 XSD 本身 (即带有根标记 的 XML 文档)使用 UTF-8 作为其字符编码。

XML 架构从不关心 XML 文档的原始字节。正在验证的是 XML 信息集。因此,简单类型的 maxLength 方面表示您在此字段中最多可以有 2000 个字符 。正如您正确指出的那样,以字节为单位的实际长度很容易超过 2000 个字符,但 XML 处理器不会知道或关心。

sometimes the XSD validates successfully, but the database insert fails

我同意 lunatikz - 最可能的解释是数据库配置不正确。

Could the solution be doing a string byte count check which matches the character count?

不,那会解决错误的问题。问题可能出在数据库中,而不是在您的 Java 代码中。

What would you suggest as the best way to ensure the XML data for the title field does not exceed a specified length, as defined in XSD.

我认为您不需要做任何事情来确保这一点。您的 XML 验证器已经在为您检查,它可能工作正常。

And that the XML data is successfully inserted into the DB as long as XSD is conformed to?

配置数据库或其 table/column 定义,使其停止尝试使用单字节字符编码解释输入。

Am I right in assuming a <xsd:maxLength value="2000"/> in the XSD matches the varchar(2000) column definition ?

是的,两者都指定了最多 2000 个字符的字段。但是数据库以不同于 XML 处理器的方式解释单词 'character'。