2014-01-07 9 views
6

Ich habe eine Abfrage für alle Sonderzeichen entfernen.
Aber ein Leerzeichen widersteht dieser Abfrage am Ende der E-Mail-Zeichenfolge.Entfernen von schadfreien Räumen?

Beispiel: '[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 

Warum?

Ich benutze diese Aussage, weil ich eine WHERE id IN() habe, also möchte ich keine Sonderzeichen in PHP verarbeiten. Ich möchte UPDATE jede E-Mails direkt mit SET und replace, trim() Funktion.

Allerdings sind einige Leerzeichen nicht gelöscht und ich weiß nicht warum.

Meine Tabelle hat etwa 12 Millionen Zeilen. Ich habe einen CRON programmiert, der sie holt, um alle Sonderzeichen zu löschen (leider, weil wir sie in der Vergangenheit nicht auf INSERT überprüft hatten).

Also habe ich diese Abfrage erstellen, um meine 12 MM Zeilen zu verarbeiten. Es funktioniert sehr gut, außer dem richtigen Leerzeichen (manchmal wird es manchmal nicht entfernt). Und ich möchte hinzufügen, dass auf Workbench die Abfrage die ganze Zeit zu 100% funktioniert. Es ergibt keinen Sinn.

Hier ist meine Abfrage erneut ohne Backslash und mit meinem 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 rund 500 ids enthält.

Ich denke, die richtige Leerzeichen, es ist ein nicht-brechender Raum, aber mein letzter Test mit CHAR(160) in meiner Abfrage hat nicht funktioniert.

+0

Warum nicht einfach eine Funktion verwenden, die speziell für diese Aufgabe in der Sprache erstellt wurde, in der Sie die Abfrage erstellen? IE. In PHP gibt es [trimmen] (http://www.php.net/manual/en/function.trim.php). – tenub

+0

Was ist Ihre Muttersprache? PHP? Ich bin mir nicht sicher, warum Sie sich die Mühe machen sollten, diese hässliche verschachtelte SQL-Anweisung zu erstellen, wenn Sie etwas wie 'preg_replace' in PHP verwenden könnten, um es auf einmal zu tun. – brandonscript

+0

@tenub Es gibt drei Trims in der Mitte des Ersatznestes. – Jerry

Antwort

2

Ok, schließlich habe ich das Problem gefunden hatte !!!

Encoding von PDO ist das Problem ...

einfach angepasst Treiberoptionen und alles funktioniert gut!

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

Danke Jungs sowieso!

+1

Ändern Sie einfach die Codierung. Was könnte schiefgehen? –

1

Wie wäre es mit Whitelisting? dh erlauben nur gültige Zeichen

regex_replace [^[email protected]] mit ''

+0

regexp_replace ist auf MySQL verfügbar? – coolfarmer

+0

ja aber als [benutzerdefinierte Funktion] (http://stackoverflow.com/questions/1755408/mysql-regex-replace) – mzzzzb