0

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

对于初学者,我知道可以使用 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 查询?

同样重要的是我们如何替换那些控制字符(例如 dec、oct、hex)?

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

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

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


我将 XHTML 编码为 application/xhtml+xml 并将以下内容测试为example1.xhtml并在Firefox中显式打开,没有 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中以无字节顺序标记 (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 - 回车

4

1 回答 1

0

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

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的问题持反动立场;因此,我仍在寻找一种编写良好的方法来防止这个问题。

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

于 2014-02-21T20:18:54.573 回答