2014-01-07 86 views
6

我有一个查询删除所有特殊字符。
但是在电子邮件字符串的末尾有一个空格阻止该查询。删除不间断空间?

例子:'[email protected] '

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每个电子邮件直接与SETreplace,trim()功能。

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

我的表格大约有12百万行。我编写了一个CRON,让他们删除所有特殊字符(不幸的是,因为过去我们没有在INSERT上检查它们)。

所以我建立了这个查询来处理我的12MM行。除了正确的空白(有时它有时不会被删除),它的工作非常好。我想补充一点,在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 IDS。

我认为正确的空格这是一个非换空间,但我与我的查询CHAR(160)最后一次测试没有工作。

+0

为什么不使用专门为此任务构建的函数,无论您使用何种语言创建查询? IE浏览器。在PHP中有[trim](http://www.php.net/manual/en/function.trim.php)。 – tenub

+0

你的母语是什么? PHP?不知道为什么你会努力做出丑陋的嵌套SQL语句,当你可以在php中使用像'preg_replace'这样的事情一次完成。 – brandonscript

+0

@tenub虽然在替换嵌套中间有三个修剪。 – Jerry

回答

2

好吧,我终于找到了问题!

编码PDO的是问题...

刚调整过的驱动程序选项,所有的工作好!

PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'') 

谢谢你们!

+1

只需更改编码。什么可能会出错? –

1

白名单如何?即只允许有效字符

regex_replace [^[email protected]]''

+0

regexp_replace在MySQL上可用吗? – coolfarmer

+0

是的,但作为[用户定义的功能](http://stackoverflow.com/questions/1755408/mysql-regex-replace) – mzzzzb