Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: ค้นหาอีเมลที่ไม่ถูกต้อง (Invalid Email) ด้วย NOT LIKE

สามารถค้นหาอีเมลที่มีรูปแบบไม่ถูกต้องใน MySQL ได้โดยใช้เงื่อนไข NOT LIKE กับรูปแบบพื้นฐานของอีเมล แม้จะไม่ครอบคลุมทุกกรณีตามมาตรฐาน RFC แต่เพียงพอสำหรับการกรองเบื้องต้น

รูปแบบคำสั่ง

SELECT email_column
FROM your_table
WHERE email_column NOT LIKE '%_@_%._%';

คำอธิบายรูปแบบ %_@_%._%:

  • %_ - มีตัวอักษรอย่างน้อย 1 ตัวก่อน @
  • @ - ต้องมีเครื่องหมาย @
  • _% - มีตัวอักษรอย่างน้อย 1 ตัวหลัง @
  • . - ต้องมีจุด (.)
  • _% - มีตัวอักษรอย่างน้อย 1 ตัวหลังจุด

ตัวอย่างการใช้งาน

สร้างตารางและเพิ่มข้อมูล (มีอีเมลผิดปกติ混入):

CREATE TABLE FindInvalidEmailAddressDemo (
    Id INT NOT NULL AUTO_INCREMENT,
    Name VARCHAR(20),
    EmailAddress VARCHAR(40),
    PRIMARY KEY (Id)
);

INSERT INTO FindInvalidEmailAddressDemo (Name, EmailAddress) VALUES
('John', 'John12@gmail.com'),
('Carol', 'Carol@hotmail.com'),
('Mike', '123Mike@gmailcom'),      -- ขาดจุด
('Bob', 'Bob909hotmail.com'),      -- ขาด @
('David', 'David@gmail.com');

ข้อมูลในตาราง:

+----+-------+-------------------+
| Id | Name  | EmailAddress      |
+----+-------+-------------------+
|  1 | John  | John12@gmail.com  |
|  2 | Carol | Carol@hotmail.com |
|  3 | Mike  | 123Mike@gmailcom  |
|  4 | Bob   | Bob909hotmail.com |
|  5 | David | David@gmail.com   |
+----+-------+-------------------+

คำสั่งค้นหาอีเมลไม่ถูกต้อง

SELECT EmailAddress
FROM FindInvalidEmailAddressDemo
WHERE EmailAddress NOT LIKE '%_@_%._%';

ผลลัพธ์:

+-------------------+
| EmailAddress      |
+-------------------+
| 123Mike@gmailcom  |
| Bob909hotmail.com |
+-------------------+

ข้อจำกัดและการปรับปรุง

รูปแบบนี้ยังผ่านอีเมลบางรูปแบบที่ผิดปกติได้ เช่น:

  • @domain.com (ไม่มีตัวหน้า @)
  • user@.com (ไม่มีโดเมน)
  • user@domain. (ไม่มี TLD)

รูปแบบที่เข้มงวดกว่า (MySQL 8.0+ ใช้ REGEXP)

SELECT EmailAddress
FROM FindInvalidEmailAddressDemo
WHERE EmailAddress NOT REGEXP '^[^@]+@[^@]+\.[^@]+$';

หรือสำหรับการตรวจสอบครบถ้วน ควรทำที่ระดับแอปพลิเคชัน (PHP, Java, v.v.) ด้วย filter_var() หรือ regex ที่ซับซ้อนกว่า