18

私のデータベースには、電子メールアドレスのつづりを間違えたユーザーがたくさんいます。これにより、ニュースレターを送信するときに、私の接尾辞が大量のメールをバウンスします。
フォームには、「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ですでに書き込まれているメールを見つける必要がありました。

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)

2番目の質問に答えるには、おそらく:などの大文字と小文字を区別する照合を使用する必要があります。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

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一緒に使用しSUBSTRたり、取得したりしてみてください。LEFT

のようなものが機能しているよう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。必要なのは、の3番目の引数が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 に答える