我有一个删除所有特殊字符的查询 但是在电子邮件字符串末尾有一个空格可以抵抗该查询。
示例:'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()
发送每封电子邮件。
但是,有些空格不会被删除,我不知道为什么。
我的表有大约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)
进行的最后一次测试不起作用。
答案 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()