【问题标题】:mysql 0 terminated string showing up in XML as Unicode 0x0mysql 0 终止的字符串在 XML 中显示为 Unicode 0x0
【发布时间】:2013-01-17 20:16:26
【问题描述】:

在将一些应用程序从 PHP 和 Delphi 迁移到 Java-RS 的过程中,一些列条目此时正在破坏表演。

在使用 JPA 从 mySQL 读取数据到 Java Pojos 后,使用 JaxB 将结果转换为 XML 并尝试将结果读回 JQuery / jqGrid 失败。

在浏览器中,问题只是显示为“格式不正确”。 使用 Eclipse XML 编辑器查看详细信息会给出错误消息:

An invalid XML character (Unicode 0x0) was found in the element content of the document

现在我想继续并修复原始数据。

  1. 查找具有 无效条目?
  2. SQL 查询如何解决这些问题 行?

假设有问题的列是“客户”表中的“名称”

对于问题 #1,我发现: SELECT name from customer where hex(name) like "%00";

工作。对于问题 #2,我假设使用左子字符串进行更新可能会起作用。在这种情况下,我不确定长度。看起来 length(name) 将返回包括终止零字符的长度。在这种情况下,使用 left(length(name)-1) 的更新会正常工作吗?

我不确定数据库的备份和恢复是否会保持当前有些损坏的数据库的状态。因此,了解如何使用故意创建以空字符结尾的字符串的插入语句来重现这种情况也会很有帮助。

【问题讨论】:

  • 我目前正在尝试自动查找罪魁祸首列 - 首先使用 xmllint 从 xml 端 - 如何使用 mySQL 来完成?
  • 在解析 XML 之前查找 XML 中的字符是否最容易,猜测它们应该看起来像 � 或类似
  • 不 - 它是一个二进制 0 仅以十六进制显示 - 这可能是 JPA 或 JaxB 问题 - 目前我不为此烦恼,并打算修复数据而不是工具。跨度>

标签: mysql xml unicode


【解决方案1】:

我认为你应该能够使用类似的东西来转换HEX()

UPDATE customer SET name=UNHEX(REPLACE(HEX(name), '00', ''));

或者干脆

UPDATE customer SET name=REPLACE(name, CHAR(0), '');

【讨论】:

  • select length(name),length(REPLACE(name, CHAR(0), '')) from customer where hex(name) like "%00%";显示字符串长度没有变化
  • 第一个建议奏效了。我决定使用替换并替换为 '0a' 为字符串结尾添加换行符。 xmllint 现在显示创建的 xml 没问题。
【解决方案2】:
update customer set name=left(name,length(name)-1) where hex(name) like "%00";

【讨论】:

  • 这也有效,但前提是在列末尾只有一个以零结尾的条目。
猜你喜欢
  • 2013-09-10
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 2016-09-01
相关资源
最近更新 更多