2010-05-26 12 views
11

In meiner Datenbank habe ich viele Benutzer, die ihre E-Mail-Adresse falsch geschrieben haben. Dies führt dazu, dass mein Postfix beim Versenden des Newsletters viele Mails abschickt.
Formen umfassen (sind aber nicht beschränkt auf) "yaho.com", "yahho .com" usw.
Sehr ärgerlich!Mysql-wie die "domain.com" in "[email protected]" zu aktualisieren

Also habe ich versucht, diese Aufzeichnung auf den richtigen Wert zu aktualisieren.
Nach select email from users where email like '%@yaho%' and email not like '%yahoo%'; und bekommen die Liste ausgeführt wird, ich bin stecken, weil ich weiß nicht, wie nur den yaho Teil zu aktualisieren. Ich brauche den Benutzernamen, um intakt zu bleiben.

Also dachte ich, ich würde nur die Datenbank sichern und Vim zu ersetzen, aber ich kann das @ Symbol nicht entgehen ..

BTW, wie wähle ich alle E-Mail in CAPS geschrieben Adressen? select upper(email) from users; würde alles einfach in CAPS umwandeln, während ich nur die bereits geschriebenen CAPS-Mails herausfinden musste.

+3

Wenn Sie eine gültige E-Mail-Adresse benötigen, können Sie bei der Registrierung eine E-Mail-Bestätigung hinzufügen? Sie können nicht garantieren, dass die Änderung von [email protected] zu [email protected] Ihren registrierten Benutzer tatsächlich erreichen wird oder dass es nicht auch einen Bounce erzeugt. –

+0

In der Tat haben Sie Recht, ich dachte auch, dass jeder vernünftige Mensch Validierung hinzufügen sollte. Aber ich bin nur der Systemadministrator hier drüben und ich dachte, ich würde die Situation von meiner Seite aus angehen. Muss einen Fehler oder eine SMS einreichen. – w00t

Antwort

27

Vielleicht möchten Sie versuchen, so etwas wie die folgenden zu vergleichen.

UPDATE users 
SET  email = CONCAT(LEFT(email, INSTR(email, '@')), 'yahoo.com') 
WHERE email LIKE '%@yaho.com%'; 

Testfall:

CREATE TABLE users (email varchar(50)); 

INSERT INTO users VALUES ('[email protected]'); 
INSERT INTO users VALUES ('[email protected]'); 
INSERT INTO users VALUES ('[email protected]'); 


UPDATE users 
SET  email = CONCAT(LEFT(email, INSTR(email, '@')), 'yahoo.com') 
WHERE email LIKE '%@yaho.com%'; 

Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 


SELECT * FROM users; 
+-----------------+ 
| email   | 
+-----------------+ 
| [email protected] | 
| [email protected] | 
| [email protected] | 
+-----------------+ 
3 rows in set (0.00 sec) 

Ihre zweite Frage zu beantworten, müssen Sie use a case sensitive collation wie die latin1_general_cs wahrscheinlich:

SELECT * FROM users WHERE email COLLATE latin1_general_cs = UPPER(email); 

Testfall:

INSERT INTO users VALUES ('[email protected]'); 


SELECT * FROM users; 
+-----------------+ 
| email   | 
+-----------------+ 
| [email protected] | 
| [email protected] | 
| [email protected] | 
| [email protected] | 
+-----------------+ 
4 rows in set (0.00 sec) 


SELECT * FROM users WHERE email COLLATE latin1_general_cs = UPPER(email); 
+-----------------+ 
| email   | 
+-----------------+ 
| [email protected] | 
+-----------------+ 
1 row in set (0.00 sec) 
+1

Großartiges Beispiel! Arbeitete ohne Probleme. Eine Sache ist jedoch, dass die Datenbank UTF8 ist, also kann ich latin1 Kollationen nicht verwenden. Aber keine große Sache, das SELECT ist nicht wichtig, ich habe alles auf Kleinbuchstaben aktualisiert. Vielen Dank! – w00t

+0

Ich komme noch Jahre später auf diese Antwort zurück. –

+0

Ich versuche @ in ein Varchar zu setzen. Aber ist sagt extranoues ... Wie man E-Mail-Adressen in mysql eingibt? – Lealo

1

Sie könnten versuchen, INSTR zusammen mit SUBSTR oder LEFT zu verwenden, um den Teil vor dem "@" - Symbol zu bekommen, vielleicht.

So etwas wie SELECT LEFT("[email protected]",INSTR("[email protected]","@")-1); scheint zu funktionieren.

+0

Ja, das funktioniert auch. – w00t

2

Ihre zweite Frage zu beantworten (etwa E-Mails geschrieben in Caps zu finden), so etwas wie dies könnte hilfreich sein:

select email from users where upper(email) = email 

(Verzeihen Sie mir, wenn die Syntax nicht genau richtig ist, da ich zu DB2 gewohnt bin . die Idee ist, die gerade E-Mail-Adresse mit der oberen gefasste Version)

+0

@Syntactic: Beachten Sie, dass der Standardzeichensatz und die Sortierfolge in MySQL standardmäßig nicht zwischen Groß- und Kleinschreibung unterscheiden. [Quelle] (http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html) –

+0

@Daniel Vassallo Guter Punkt. Jeden Tag etwas Neues lernen. – Syntactic

+0

Oh ich denke ich verstehe was du meinst. Aber anstatt UPPER-Mails zu finden, gibt es alle untergeordneten Mails zurück. Ungefähr 50.000 davon :)) Schön genug mit der Groß-/Kleinschreibung, es gibt kein Problem mit dem Versenden von Mails oder irgendetwas anderem, es hat nur meine Augen gestört. – w00t

1

Für die erste Frage, würde ich so etwas wie wählen

UPDATE users 
SET email = INSERT(email,INSTR(email,'@'), LENGTH(email), '@yahoo.com') 
WHERE email LIKE '%@yaho.com' 

Nur um gründlich zu sein, ist dies Multi-Byte-sicher, obwohl ich LENGTH verwendet habe. Alles was benötigt wird ist, dass das dritte Argument von INSERT mindestens so groß wie das Ende der Teilkette ist.

Syntactics Antwort auf die Suche nach der All-Caps-E-Mail ist eine gute Antwort. Möglicherweise etwas schneller durchführen, obwohl Sie würde wahrscheinlich nicht den Unterschied bemerken, ist

SELECT email FROM users WHERE BINARY(email) NOT REGEXP '[a-z]' 

Update: BINARY(email) benötigt wird case-sensitive Anpassung zu erzwingen.

+1

Ich denke, Sie müssen das '@' in einfache Anführungszeichen in der 'INSTR()' Funktion wickeln, sonst wird es 'NULL' zurückgeben. Auch ich denke, Ihre letzte Abfrage sollte etwa so aussehen: 'Von Benutzern WHERE E-Mail NICHT REGEXP ...'. –

+1

In der Tat benötigt das '@' einfache Anführungszeichen, weil es 'NULL' zurückgegeben hat. Es funktionierte nach. Die zweite Abfrage stimmt nur mit E-Mails überein, die aus Zahlen oder + --_ bestehen, aber keine alphabetischen. – w00t

+0

Danke für die Korrekturen! –

0
UPDATE contacts SET email = REPLACE(email, SUBSTRING_INDEX(email, '@', -1), 'domain.com') 
Verwandte Themen