Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中加载UTF-8编码的XML数据时发生数据库错误_Java_Xml_Xsd_Mariadb_Xmlschema - Fatal编程技术网

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

在Java中加载UTF-8编码的XML数据时发生数据库错误,java,xml,xsd,mariadb,xmlschema,Java,Xml,Xsd,Mariadb,Xmlschema,我正在这里讨论我的问题,不确定这是否会引发大量的关闭 简化:我有一个系统,可以读取XML文件并将其加载到数据库中 XML有一个具有以下内容的架构: <?XML version="1.0" encoding="UTF-8"?> 当数据库插入操作失败时,ops需要手动减少XML字段的长度,并重新处理XML文件以修复它 我一直在研究: 字节与字符长度检查 模式验证 等 解决方案是否可以执行与字符计数匹配的字符串字节计数检查 我可以用Java编写

我正在这里讨论我的问题,不确定这是否会引发大量的关闭

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

XML有一个具有以下内容的架构:

<?XML version="1.0" encoding="UTF-8"?>
当数据库插入操作失败时,ops需要手动减少XML字段的长度,并重新处理XML文件以修复它

我一直在研究:

  • 字节与字符长度检查
  • 模式验证
解决方案是否可以执行与字符计数匹配的字符串字节计数检查

我可以用Java编写字符串.getBytes(“UTF-8”).length,但是如何匹配XSD中的
varchar(2000)

您认为什么是确保标题字段的XML数据不超过XSD中定义的指定长度的最佳方法。只要符合XSD,XML数据就会成功插入数据库

假设XSD中的
varchar(2000)
列定义匹配,对吗

该模式符合UTF-8

不完全是,但我想我知道你的意思。您引用的XML声明没有指定与此架构匹配的XML实例文档相关的任何内容。简单地说,XSD本身(即带有根标记的XML文档)使用UTF-8作为其字符编码

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

有时XSD验证成功,但数据库插入失败

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

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

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

您认为什么是确保标题字段的XML数据不超过XSD中定义的指定长度的最佳方法

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

只要符合XSD,XML数据就会成功插入数据库

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

假设XSD中的a与varchar(2000)列定义匹配,对吗

是的,两者都指定了最多2000个字符的字段。但数据库对“字符”一词的解释方式与XML处理器不同

该模式符合UTF-8

不完全是,但我想我知道你的意思。您引用的XML声明没有指定与此架构匹配的XML实例文档相关的任何内容。简单地说,XSD本身(即带有根标记的XML文档)使用UTF-8作为其字符编码

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

有时XSD验证成功,但数据库插入失败

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

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

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

您认为什么是确保标题字段的XML数据不超过XSD中定义的指定长度的最佳方法

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

只要符合XSD,XML数据就会成功插入数据库

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

假设XSD中的a与varchar(2000)列定义匹配,对吗


是的,两者都指定了最多2000个字符的字段。但是数据库对“character”一词的解释方式与XML处理器不同。

由于您在使用多字节字符存储字符串时遇到问题,您是否检查了db字段的字符集和排序规则?您好Lunatikz,我所掌握的唯一信息是mo中的列定义。我已向ops请求日志等。我可以澄清一下,多字节字符可以工作,但是当它超过某个限制时,就会发生DB错误。由于您在使用多字节字符存储字符串时遇到问题,您是否检查了DB字段的字符集和排序规则?您好Lunatikz,我所掌握的唯一信息是生产任务单上的列定义。我已向ops请求日志等。我可以澄清一下,多字节字符是有效的,但是当它超过某个限制时,就会出现DB错误。哇,谢谢Kimbert和Lunatikz。我认为解决方案是“配置数据库或其表/列定义,以便它停止尝试使用单字节字符编码解释输入”。如果我理解正确的话,您的意思是在mo中,DB被配置为每个字段插入的每个字符都应该是一个字节字符。那么,当200
<xsd:simpleType name="title">
.....
<xsd:restriction base="xsd:string">
 <xsd:minLength value="1"/>
 <xsd:maxLength value="2000"/>
</xsd:restriction>
The database 'title' column is defined as `varchar(2000)`