【发布时间】: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 的一部分,所以显然我们不想删除这些以确保保留换行符,除非我错过了有什么?
这是我现在要去的参考页面...
我将 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>�	



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

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