18

在我的数据库中,有很多用户拼错了他们的电子邮件地址。这反过来又导致我的 postfix 在发送时事通讯时退回很多邮件。
形式包括(但不限于)“yaho.com”、“yahho.com”等。
很烦人!

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

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

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

4

6 回答 6

42

您可能想尝试以下方法:

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)

要回答您的第二个问题,您可能需要使用区分大小写的排序规则,例如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)
于 2010-05-26T14:36:43.053 回答
2

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

select email from users where upper(email) = email

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

于 2010-05-26T14:34:13.620 回答
2
UPDATE users SET email = REPLACE( email, SUBSTRING_INDEX( email,  '@', -1 ) ,  CONCAT(user_id, 'domain.com' ) ) WHERE [MYSQL CONDITION];

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

于 2019-02-28T06:37:00.447 回答
1

也许您可以尝试与“@”符号INSTR一起使用SUBSTRLEFT获取“@”符号之前的部分。

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

于 2010-05-26T14:31:59.880 回答
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)需要强制区分大小写匹配。

于 2010-05-26T14:45:49.397 回答
1
UPDATE contacts SET email = REPLACE(email, SUBSTRING_INDEX(email, '@', -1), 'domain.com')
于 2017-03-30T15:19:25.200 回答