在Java中加载UTF-8编码的XML数据时发生数据库错误
我正在这里讨论我的问题,不确定这是否会引发大量的关闭 简化:我有一个系统,可以读取XML文件并将其加载到数据库中 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 version="1.0" encoding="UTF-8"?>
当数据库插入操作失败时,ops需要手动减少XML字段的长度,并重新处理XML文件以修复它
我一直在研究:
- 字节与字符长度检查
- 模式验证
- 等
和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)`