【问题标题】:Mass Find and Replace control characters in SQL批量查找和替换 SQL 中的控制字符
【发布时间】:2014-03-23 11:59:42
【问题描述】:

ASCII 控制字符正在以一种半频率的方式进入我维护的数据库中。虽然我计划实施防止它们被INSERT 编入 SQL 的方法,但我必须首先处理数据库中已经存在的字符first

对于初学者,我知道可以使用 SQL 进行查找和替换...

UPDATE [table_name] 
SET [field_name]=REPLACE([field_name],'[string_to_find]','[string_to_replace]');

PHP 允许您使用数组将多个项目替换为其他内容...

$result = str_ireplace(array('1','2','3','4','5'),'0',$my_string);

那么,有没有一种方法可以构造一个 SQL 查询来替换多个 ASCII 控制字符,而不是循环中的惰性 SQL 查询?

同样重要的是如何替换那些控制字符(例如十进制、八进制、十六进制)?

我还读到 回车 是控制字符 0~31 的一部分,所以显然我们不想删除这些以确保保留换行符,除非我错过了有什么?

这是我现在要去的参考页面...

http://www.ascii-code.com/


我将 XHTML 编码为 application/xhtml+xml 并将以下内容测试为 example1.xhtml 并在 Firefox 中使用 NO BYTE ORDER MARK (BOM) 显式打开...

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
</head>

<body>

<div>
<p>&#000;&#001;&#002;&#003;&#004;&#005;&#006;&#007;&#008;&#009;
&#010;&#011;&#012;&#013;&#014;&#015;&#016;&#017;&#018;&#019;
&#020;&#021;&#022;&#023;&#024;&#025;&#026;&#027;&#028;&#029;
&#030;&#031;</p>
</div>

</body>
</html>

以下是唯一可以在不创建格式错误的 XML 的情况下使用的字符,保存为 example2.xhtml 并在 Firefox 中使用 NO BYTE ORDER MARK 显式打开(BOM)...

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
</head>

<body>

<div>
<p>&#009;&#010;&#013;</p>
</div>

</body>
</html>

那些我们想要在 SQL 中去除的工作字符是......

  • 09 - 水平制表符

  • 10 - 换行

  • 13 - 回车

【问题讨论】:

  • 所以你只想删除一些控制字符,而不是其他的?您确实要删除哪些字符(以及为什么)? MySQL 没有执行此类操作的任何本机方法,尽管您可以使用 UDF(例如 lib_mysqludf_preg 库提供的 PREG_REPLACE() 函数)来实现这一目的。
  • @eggyal 我已经进行了一些测试并更新了哪些字符需要替换以防止从 SQL 接收 XML 时出现格式错误。
  • 如果是不渲染无效 XML 的情况,您可能应该在输出为 XML 之前通过转义函数传递数据库结果。否则 XML 也可能被非控制(即“打印”字符)破坏,例如 &lt;&amp;
  • @eggyal 使用htmlspecialchars() 在一定程度上是有效的。虽然我愿意使用其他功能或组合,但目标是简单地清理整个表格。
  • XML 1.0 确实不支持您标识为无效的“控制”字符,但它们在 XML 1.1 中有效。出于兴趣,您为什么在 XML 1.0 中使用 XHTML 1.1?

标签: mysql replace ascii control-characters


【解决方案1】:

这适用于初学者,但不一定会大量使用......

UPDATE a_log SET useragent=replace(useragent,char(4),'');
UPDATE a_log SET useragent=replace(useragent,char(5),'');

我首先从 Firefox 复制 XML 解析错误。 Windows 7 剪贴板确实在进行复制和粘贴时正确保留了 ASCII 控制字符。然后我将有问题的文字粘贴到这个网站的表格中......

http://www.asciivalue.com/

找到我使用 DECOCT(它们的列值匹配)来引用此站点上的字符的行...

http://www.ascii-code.com/

...经过一些研究,我能够整理出几行代码来清除导致我的 XML 格式错误的违规字符。

我仍然会接受更好的答案,因为重点是更多的拖网式修复。此外,我积极承认,不幸的是,这更像是对问题的反动立场,我仍然必须创建、测试和实施措施以防止 ASCII控制字符被插入到MySQL 开始;因此,我仍在寻找一种编写良好的方法来防止这个问题。

如果有人问同样的问题并遇到它,他们至少有一些有效的方法来解决问题。

【讨论】:

    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多