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

w00*_*00t 14 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邮件.

Dan*_*llo 34

您可能想尝试以下内容:

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

测试用例:

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)
Run Code Online (Sandbox Code Playgroud)

要回答第二个问题,您可能需要使用区分大小写的排序规则,例如latin1_general_cs:

SELECT * FROM users WHERE email COLLATE latin1_general_cs = UPPER(email);
Run Code Online (Sandbox Code Playgroud)

测试用例:

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)
Run Code Online (Sandbox Code Playgroud)

  • 好例子!工作没有问题.但有一点,数据库是UTF8,所以我不能使用latin1排序规则.但不是很重要,SELECT并不重要,我只是将所有内容更新为小写.谢谢! (2认同)