2010-05-26 2 views
11

В моей базе данных у меня много пользователей, которые ошибочно написали свой адрес электронной почты. Это, в свою очередь, заставляет мой постфикс отказываться от большого количества писем при отправке информационного бюллетеня.
Формы включают (но не ограничиваются ими) "yaho.com", "yahho .com" и т. Д.
Очень раздражает!Mysql - как обновить «domain.com» в «[email protected]»

Так что я пытался обновить эти записи до нужного значения.
После выполнения select email from users where email like '%@yaho%' and email not like '%yahoo%'; и получения списка, я застрял, потому что не знаю, как обновить только часть yaho. Мне нужно, чтобы имя пользователя оставалось нетронутым.

Так я думал, что просто дамп базы данных и использовать Vim для замены, но я не могу избежать @ символ ..

Кстати, как я могу выбрать все адреса электронной почты, написанные в CAPS? select upper(email) from users; просто превратил бы все в CAPS, тогда как мне просто нужно было узнать уже написанные в CAPS письма.

+3

Если вам требуются действительные адреса электронной почты, вы можете добавить проверку по электронной почте при регистрации? Вы не можете гарантировать, что изменение [email protected] на [email protected] действительно достигнет вашего зарегистрированного пользователя, а также не приведет к отказу. –

+0

Действительно, вы правы, я также думал, что любой здравомыслящий человек должен добавить подтверждение. Но я всего лишь администратор, и я подумал, что я должен решить эту проблему с моей стороны. Должен представить ошибку или smth. – w00t

ответ

27

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

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 ('[email protected]'); 
INSERT INTO users VALUES ('[email protected]'); 
INSERT INTO users VALUES ('[email protected]'); 


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   | 
+-----------------+ 
| [email protected] | 
| [email protected] | 
| [email protected] | 
+-----------------+ 
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 ('[email protected]'); 


SELECT * FROM users; 
+-----------------+ 
| email   | 
+-----------------+ 
| [email protected] | 
| [email protected] | 
| [email protected] | 
| [email protected] | 
+-----------------+ 
4 rows in set (0.00 sec) 


SELECT * FROM users WHERE email COLLATE latin1_general_cs = UPPER(email); 
+-----------------+ 
| email   | 
+-----------------+ 
| [email protected] | 
+-----------------+ 
1 row in set (0.00 sec) 
+1

Отличный пример! Работал без проблем. Одна вещь, однако, база данных UTF8, поэтому я не могу использовать latin1-сортировки. Но неважно, SELECT не является жизненно важным, я просто обновил все до нижнего регистра. Спасибо! – w00t

+0

Я еще вернусь к этому ответу спустя годы. –

+0

Я пытаюсь поставить @ в varchar. Но говорит extranoues ... Как ввести адреса электронной почты в mysql? – Lealo

1

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

Нечто вроде SELECT LEFT("[email protected]",INSTR("[email protected]","@")-1); похоже на работу.

+0

Да, это тоже работает. – w00t

2

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

select email from users where upper(email) = email 

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

+0

@Syntactic: Обратите внимание, что по умолчанию набор символов и сортировка по умолчанию в MySQL не зависят от регистра. [Источник] (http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html) –

+0

@ Даниэль Вассалло Хорошая точка. Изучайте что-то новое каждый день. – Syntactic

+0

О, я думаю, я понимаю, что вы имеете в виду. Но вместо того, чтобы находить сообщения UPPER, он возвращает все более дешевые почтовые отправления .. около 50 000 из них :)) Достаточно честный, нечувствительный к регистру, нет проблем с отправкой писем или чего-то еще, это просто то, что это беспокоило мои глаза. – w00t

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]' 

Update: BINARY(email) требуется, чтобы заставить регистрозависимое соответствие.

+1

Я думаю, вам нужно обернуть '@' в одинарных кавычках в функции 'INSTR()', иначе он вернет 'NULL'. Также я предполагаю, что ваш последний запрос должен выглядеть примерно так: «FROM users WHERE email NOT REGEXP ...». –

+1

Действительно, '@' нужны одинарные кавычки, потому что он вернул «NULL». Это сработало. Второй запрос соответствует только электронным письмам, состоящим из цифр или + -, но не в алфавитном порядке. – w00t

+0

Спасибо за исправления! –

0
UPDATE contacts SET email = REPLACE(email, SUBSTRING_INDEX(email, '@', -1), 'domain.com') 
Смежные вопросы