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)