【发布时间】:2014-01-25 14:20:28
【问题描述】:
我有一个删除所有特殊字符的查询。
但是 ONE 空格会在电子邮件字符串的末尾拒绝该查询。
例如:'test@hotmail.com '
UPDATE my_table SET email= REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TRIM(LTRIM(RTRIM(email))),\'\x0B\',\'\'),\'\0\',\'\'),\'\t\',\'\'),\'\r\',\'\'),\'\n\',\'\'),\'\r\n\',\'\'),\'\n\r\',\'\'),\' \',\'\'),CHAR(160),\'\') WHERE id=X
为什么?
我使用这个语句是因为我有一个WHERE id IN(),所以我不想在 PHP 中处理特殊字符。我想UPDATE 每封邮件都直接用SET 和replace, trim() 函数。
但是,一些空白没有被删除,我不知道为什么。
我的表大约有 1200 万行。我编写了一个 CRON 来获取它们以删除所有特殊字符(不幸的是,因为过去我们没有在 INSERT 上检查它们)。
所以我构建了这个查询来处理我的 12 MM 行。除了正确的空白(有时它会被删除,有时不会)之外,它的效果非常好。我想在 Workbench 上添加它,查询始终 100% 有效。这没有意义。
这是我的查询,没有反斜杠,我的where IN:
UPDATE NEWSLETTER_SUBSCRIPTION SET email= REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TRIM(LTRIM(RTRIM(email))),'\x0B',''),'\0',''),'\t',''),'\r',''),'\n',''),'\r\n',''),'\n\r',''),' ',''),CHAR(160),'') WHERE id IN (' . implode(',', $idEmailToBeProcess) . ')
$idEmailToBeProcess 包含大约 500 个 ID。
我认为正确的空格是一个不间断的空格,但是我在查询中使用 CHAR(160) 进行的最后一次测试不起作用。
【问题讨论】:
-
为什么不直接使用专门为此任务构建的函数,无论您使用何种语言创建查询? IE。在 PHP 中有 trim.
-
您的母语是什么? php?当您可以在 php 中使用
preg_replace之类的东西一次性完成时,不知道为什么要努力制作那个丑陋的嵌套 SQL 语句。 -
@tenub 不过替换巢的中间有三个修剪。
-
我只是编辑我的帖子以添加一些关于我的工作流程的信息和一些细节。谢谢你们帮助我。 ^^
-
@coolfarmer 是不是unicode nbsp?检查这是否返回 1 或 0:
SELECT * FROM tab WHERE id = test_id AND hex(col_name) LIKE '%C2A0%',使用 E28083、E28082、E280AF、EFBBBF 重试查询。这些是不同种类的 unicode nbsp,en space,em space,...如果其中一个是肯定的,你就明白了。