Mysql-как обновить "domain.com" в "address@domain.com" - PullRequest
14 голосов
/ 26 мая 2010

В моей базе данных много пользователей, которые неправильно написали свой адрес электронной почты. Это, в свою очередь, заставляет мой постфикс пересылать много писем при отправке бюллетеня.
Формы включают (но не ограничиваются) "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 ]

34 голосов
/ 26 мая 2010

Вы можете попробовать что-то вроде следующего:

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)
2 голосов
/ 26 мая 2010

Чтобы ответить на ваш второй вопрос (о поиске писем, написанных заглавными буквами), может пригодиться что-то вроде этого:

select email from users where upper(email) = email

(Простите, если синтаксис не совсем правильный, поскольку я привык к DB2. Идея состоит в том, чтобы сравнить прямой адрес электронной почты с версией в верхнем регистре.)

1 голос
/ 26 мая 2010

Для первого вопроса я бы выбрал что-то вроде

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

Просто ради тщательности, это многобайтовый сейф, хотя я использовал LENGTH. Все, что нужно, это чтобы третий аргумент INSERT был хотя бы таким же большим, как конец подстроки.

Синтаксический ответ о поиске электронного письма с заглавными буквами - хороший ответ. Возможно, выполнение немного быстрее, хотя вы, вероятно, не заметите разницу, это

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

Обновление: BINARY(email) необходимо для принудительного сопоставления с учетом регистра.

1 голос
/ 26 мая 2010

Вы можете попробовать использовать INSTR вместе с SUBSTR или LEFT, чтобы получить деталь перед символом "@", возможно.

Кажется, что-то вроде SELECT LEFT("foo@yaho.com",INSTR("foo@yaho.com","@")-1); работает.

0 голосов
/ 28 февраля 2019
UPDATE users SET email = REPLACE( email, SUBSTRING_INDEX( email,  '@', -1 ) ,  CONCAT(user_id, 'domain.com' ) ) WHERE [MYSQL CONDITION];

Чтобы обновить адрес электронной почты для проверки адреса электронной почты

0 голосов
/ 30 марта 2017
UPDATE contacts SET email = REPLACE(email, SUBSTRING_INDEX(email, '@', -1), 'domain.com')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...