Mysql-如何更新“address@domain.com”中的“domain.com”

时间:2010-05-26 14:29:32

标签: mysql email email-address

在我的数据库中,我有很多用户拼错了他们的电子邮件地址。这反过来导致我的postfix在发送简报时反弹了很多邮件 表格包括(但不限于)“yaho.com”,“yahho .com”等 非常讨厌!

所以我一直在尝试将这些记录更新为正确的值 执行select email from users where email like '%@yaho%' and email not like '%yahoo%';并获取列表后,我被卡住了,因为我不知道如何只更新yaho部分。我需要保留用户名。

所以我想我只是转储数据库并使用vim替换,但我无法逃避@符号..

顺便说一句,如何选择用CAPS写的所有电子邮件地址? select upper(email) from users;只会将所有内容转换为CAPS,而我只需要找出已经写入CAPS的邮件。

6 个答案:

答案 0 :(得分:34)

您可能想尝试以下内容:

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

测试用例:

CREATE TABLE users (email varchar(50));

INSERT INTO users VALUES ('test1@yahoo.com');
INSERT INTO users VALUES ('test2@yaho.com');
INSERT INTO users VALUES ('test3@yahoo.com');


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           |
+-----------------+
| test1@yahoo.com |
| test2@yahoo.com |
| test3@yahoo.com |
+-----------------+
3 rows in set (0.00 sec)

要回答第二个问题,您可能需要use a case sensitive collation,例如latin1_general_cs

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

测试用例:

INSERT INTO users VALUES ('TEST4@YAHOO.COM');


SELECT * FROM users;   
+-----------------+
| email           |
+-----------------+
| test1@yahoo.com |
| test2@yahoo.com |
| test3@yahoo.com |
| TEST4@YAHOO.COM |
+-----------------+
4 rows in set (0.00 sec)


SELECT * FROM users WHERE email COLLATE latin1_general_cs = UPPER(email);
+-----------------+
| email           |
+-----------------+
| TEST4@YAHOO.COM |
+-----------------+
1 row in set (0.00 sec)

答案 1 :(得分:2)

要解决您的第二个问题(关于查找以大写字母书写的电子邮件),这样的事情可能会有所帮助:

select email from users where upper(email) = email

(如果语法不正确,请原谅我,因为我已经习惯了DB2。想法是将直接电子邮件地址与大写版本进行比较。)

答案 2 :(得分:1)

您可以尝试将INSTRSUBSTRLEFT一起使用,以获取“@”符号之前的部分。

SELECT LEFT("foo@yaho.com",INSTR("foo@yaho.com","@")-1);这样的东西似乎有效。

答案 3 :(得分:1)

对于第一个问题,我会选择像

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

只是为了彻底,即使我使用LENGTH,这也是多字节安全的。所需要的只是INSERT的第三个参数至少与子字符串的结尾一样大。

Syntactic找到全封闭电子邮件的答案是一个很好的答案。可能表现得稍微快一点,虽然您可能没有注意到差异,但

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

更新:需要BINARY(email)来强制区分大小写的匹配。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

UPDATE users SET email = REPLACE( email, SUBSTRING_INDEX( email,  '@', -1 ) ,  CONCAT(user_id, 'domain.com' ) ) WHERE [MYSQL CONDITION];

要更新实时电子邮件地址以测试电子邮件地址