2014-01-07 136 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