2014-01-07 8 views
6

すべての特殊文字を削除するクエリがあります。
しかし、1つのスペースは、電子メール文字列の最後にそのクエリに抵抗します。改行しないスペースを削除しますか?

例:'[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の特殊文字を処理する必要はありません。私はSETreplacetrim()の機能を持つすべての電子メールに直接UPDATEしたいです。

ただし、一部の空白は削除されず、理由はわかりません。

テーブルには約1200万行があります。すべてのスペシャルキャラクターを削除するためにそれらをフェッチする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のIDが含まれています。

私は右の空白が、それは改行なしスペースだが、私のクエリでCHAR(160)と私の最後のテストが機能しなかったと思います。

+0

質問を作成している言語でこのタスク用に特別に作成された関数を使用するだけではどうですか? IE。 PHPでは[trim](http://www.php.net/manual/en/function.trim.php)があります。 – tenub

+0

母国語は何ですか? PHP?あなたがPHPで 'preg_replace'のようなものを使うことができるときに、その醜いネストされたSQLステートメントを作る努力をしている理由は分かりません。 – brandonscript

+0

@tenub交換ネストの途中に3つのトリムがあります。 – Jerry

答えて

2

regex_replaceの[^[email protected]]を許可し[OK]を、最終的に私はこの問題を発見しました! PDOの

エンコーディングは...

だけ調整ドライバオプション問題であり、すべてが良い作品!

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

とにかくありがとう!

+1

エンコードを変更するだけです。可能なことが間違っていますか? –

1

ホワイトリストについてはどうですか?つまり、有効な文字のみに''

+0

regexp_replaceはMySQLで利用できますか? – coolfarmer

+0

はい、ただし[ユーザー定義関数](http://stackoverflow.com/questions/1755408/mysql-regex-replace) – mzzzzb

関連する問題