Mysql 大规模查找和替换SQL中的控制字符
ASCII控制字符正在以半频繁的方式进入我维护的数据库。当我计划实现防止它们被插入SQL的方法时,我必须首先处理数据库中已经存在的字符 首先,我知道可以使用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',
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>�	



</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>	

</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>�	



</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>	

</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控制字符。然后我在这个网站的表单中粘贴了有问题的文本
查找行时,我使用了DEC和OCT(它们的列值匹配)来引用此站点上的字符
…经过一点研究后,我能够拼凑出几行字来清除那些最终导致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?