2010-05-26 10 views
11

En mi base de datos tengo muchos usuarios que han escrito mal su dirección de correo electrónico. Esto a su vez hace que mi postfix reboten muchos correos al enviar el boletín.
Las formas incluyen (pero no están limitadas a) "yaho.com", "yahho .com", etc.
¡Muy molesto!Mysql: cómo actualizar el "dominio.com" en "direcció[email protected]"

Así que he estado tratando de actualizar esos registros con el valor correcto.
Después de ejecutar select email from users where email like '%@yaho%' and email not like '%yahoo%'; y obtener la lista, estoy atascado porque no sé cómo actualizar solo la parte yaho. Necesito que el nombre de usuario quede intacto.

Así que pensé que lo haría simplemente volcar la base de datos y utilizar vim para reemplazar, pero no puede escapar el símbolo @ ..

Por cierto, ¿cómo puedo seleccionar todas las direcciones de correo electrónico escritos en mayúsculas? select upper(email) from users; simplemente transformaría todo en CAPS, mientras que solo necesitaba averiguar los correos ya escritos en CAPS.

+3

Si necesita direcciones de correo electrónico válidas, se puede añadir una verificación de e-mail con el registro? No puede garantizar que el cambio de [email protected] a [email protected] llegue realmente a su usuario registrado, ni que tampoco genere un rebote. –

+0

De hecho, tienes razón, también pensé que cualquier persona cuerda debería agregar validación. Pero yo soy el administrador de sistemas aquí y pensé en abordar la situación desde mi lado. Tendrá que enviar un error o algo. – w00t

Respuesta

27

es posible que desee probar algo como lo siguiente:. caso

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

prueba:

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) 

Para responder a su segunda pregunta, es probable que necesite use a case sensitive collation como el latin1_general_cs:

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

caso de prueba:

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

¡Gran ejemplo! Trabajó sin problemas Sin embargo, una cosa es que la base de datos es UTF8, así que no puedo usar colaciones latin1. Pero no es gran cosa, el SELECT no es vital, simplemente actualicé todo a minúsculas. ¡Gracias! – w00t

+0

Todavía estoy volviendo a esta respuesta años más tarde. –

+0

Estoy tratando de poner @ en varchar. Pero dice extraños ... ¿Cómo ingresar direcciones de correo electrónico en mysql? – Lealo

1

Puede intentar usar INSTR junto con SUBSTR o LEFT para obtener la pieza antes del símbolo "@", tal vez.

Algo así como SELECT LEFT("[email protected]",INSTR("[email protected]","@")-1); parece que funciona.

+0

Sí, esto también funciona. – w00t

2

Para hacer frente a la segunda pregunta (sobre la búsqueda de mensajes de correo electrónico escritos en mayúsculas), algo como esto podría ser útil:

select email from users where upper(email) = email 

(Perdóname si la sintaxis no es precisamente correcto, ya que estoy acostumbrado a DB2 . la idea es comparar la dirección de correo electrónico directamente con la versión a mayusculas)

+0

@Syntactic: Tenga en cuenta que el conjunto de caracteres predeterminado y la intercalación en MySQL no distinguen entre mayúsculas y minúsculas por defecto. [Fuente] (http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html) –

+0

@Daniel Vassallo Buen punto. Aprendiendo algo nuevo cada día. – Syntactic

+0

Oh, creo que entiendo lo que quieres decir. Pero en lugar de encontrar correos SUPERIORES, devuelve todos los correos con mayúsculas y minúsculas ... aproximadamente 50,000 de ellos :)) Bastante digno de mayúsculas y minúsculas, no hay problema con el envío de correos o cualquier otra cosa, es solo que me molestaba. – w00t

1

Para la primera pregunta, yo elegiría algo así como

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

Solo por el mero hecho de ser minucioso, esto es seguro en varios bytes aunque utilicé LENGTH. Todo lo que se necesita es que el tercer argumento de INSERT sea al menos tan grande como el final de la subcadena.

La respuesta de Syntactic de encontrar el correo electrónico con mayúsculas es una buena respuesta. Posiblemente la realización de un poco más rápido, aunque es probable que no se daría cuenta de la diferencia, es

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

Actualización: se necesita BINARY(email) a la fuerza entre mayúsculas y minúsculas juego.

+1

Creo que debe ajustar '@' entre comillas simples en la función 'INSTR()', de lo contrario, devolverá 'NULL'. También creo que su última consulta debería parecerse a 'FROM usuarios DONDE el correo electrónico NO REGEXP ...'. –

+1

De hecho, el '@' necesitaba comillas simples porque devolvía 'NULL'. Funcionó después. La segunda consulta solo coincide con los correos electrónicos que están hechos de números o + --_ pero no alfabéticos. – w00t

+0

¡Gracias por las correcciones! –

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