删除不间断的空间?

时间:2014-01-07 18:51:04

标签: mysql space

我有一个删除所有特殊字符的查询 但是在电子邮件字符串末尾有一个空格可以抵抗该查询。

示例:'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中处理特殊字符。我想直接使用UPDATESETreplace函数trim()发送每封电子邮件。

但是,有些空格不会被删除,我不知道为什么。

我的表有大约1,200万行。我编写了一个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)进行的最后一次测试不起作用。

3 个答案:

答案 0 :(得分:2)

好的,最后我发现了问题!!!

PDO的编码是问题......

只需调整驱动程序选项,一切正常!

PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'')
无论如何,谢谢你们!

答案 1 :(得分:1)

白名单怎么样?即只允许有效字符

regex_replace [^-_.@a-zA-Z]''

答案 2 :(得分:0)

发现在 MySQL 上检查 CHAR(160) 不起作用。对于 UTF-8 NBSP,以下对我有用:

REPLACE(the_field, UNHEX('C2A0'), ' '). 

针对类似堆栈溢出问题提供的解决方案 Whitespace in a database field is not removed by trim()