Mysql 大规模查找和替换SQL中的控制字符

Mysql 大规模查找和替换SQL中的控制字符,mysql,replace,ascii,control-characters,Mysql,Replace,Ascii,Control Characters,ASCII控制字符正在以半频繁的方式进入我维护的数据库。当我计划实现防止它们被插入SQL的方法时,我必须首先处理数据库中已经存在的字符 首先,我知道可以使用SQL进行查找和替换 UPDATE [table_name] SET [field_name]=REPLACE([field_name],'[string_to_find]','[string_to_replace]'); PHP允许您使用数组将多个项替换为其他项 $result = str_ireplace(array('1','2',

ASCII控制字符正在以半频繁的方式进入我维护的数据库。当我计划实现防止它们被插入SQL的方法时,我必须首先处理数据库中已经存在的字符

首先,我知道可以使用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查询来构造SQL查询来替换多个ASCII控制字符

同样非常重要的是,我们如何替换这些控制字符(如dec、oct、hex)

我还读到,回车是控制字符0~31的一部分,所以很明显,我们不想删除这些字符,以确保保留换行符,除非我在这方面遗漏了什么

这是我正在浏览的参考页


我将XHTML编码为application/XHTML+xml,并将以下内容测试为示例1。XHTML并在Firefox中显式打开,无字节顺序标记(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 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>

�	






以下是唯一可以在不创建格式错误的XML的情况下使用的字符,另存为示例2.xhtml,并在Firefox中以无字节顺序标记(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 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-运输申报表


这对初学者来说是可行的,但不一定是大规模的

UPDATE a_log SET useragent=replace(useragent,char(4),'');
UPDATE a_log SET useragent=replace(useragent,char(5),'');
我首先从Firefox复制了XML解析错误。在进行复制和粘贴时,Windows 7剪贴板不会正确保留ASCII控制字符。然后我在这个网站的表单中粘贴了有问题的文本

查找行时,我使用了DECOCT(它们的列值匹配)来引用此站点上的字符

…经过一点研究后,我能够拼凑出几行字来清除那些最终导致XML格式错误的违规字符

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


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

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