ใช้ REGEXP / RLIKE สำหรับ Pattern Matching
MySQL รองรับ Regular Expression ผ่าน REGEXP (หรือ RLIKE alias) สำหรับ Pattern Matching ที่ซับซ้อนกว่า LIKE
ตัวอย่าง: เมืองที่ขึ้นต้นด้วยสระ 2 ตัวติดกัน
CREATE TABLE DemoTable664 (CityName VARCHAR(100));
INSERT INTO DemoTable664 VALUES
('Springfield'), ('Austin'), ('Franklin'), ('OAKLAND'), ('Anchorage');
Query: ใช้ REGEXP Pattern ^[aeiouAEIOU][aeiouAEIOU]
SELECT * FROM DemoTable664
WHERE CityName RLIKE '^[aeiouAEIOU][aeiouAEIOU]';
ผลลัพธ์: Austin (Au), OAKLAND (OA)
+----------+
| CityName |
+----------+
| Austin |
| OAKLAND |
+----------+
อธิบาย Pattern
^- เริ่มต้นสตริง (Anchor)[aeiouAEIOU]- Character Class: สระภาษาอังกฤษ (a,e,i,o,u) พิมพ์เล็กและใหญ่[aeiouAEIOU]- สระอีกตัวหนึ่ง (ติดกัน 2 ตัว)
Regex Patterns ที่ใช้บ่อยใน MySQL
| Pattern | ความหมาย | ตัวอย่าง Match |
|---|---|---|
^abc | ขึ้นต้นด้วย abc | abc, abcdef |
abc$ | ลงท้ายด้วย abc | abc, defabc |
^abc$ | เท่ากับ abc ทุกตัว | abc |
[abc] | ตัวอักษรใดตัวหนึ่ง a,b,c | a, b, c |
[^abc] | ไม่ใช่ a,b,c | d, e, 1 |
a.b | a ตามด้วยตัวอะไรก็ได้ 1 ตัว แล้ว b | aXb, a1b, a b |
a.*b | a ตามด้วยอะไรก็ได้ 0+ ตัว แล้ว b | ab, aXb, aXYZb |
[0-9] | ตัวเลข 0-9 | 0, 5, 9 |
[a-zA-Z] | ตัวอักษรภาษาอังกฤษ | a, Z, m |
Case Sensitivity
- MySQL 8.0+:
REGEXPเป็น Case Insensitive โดย Default (ขึ้นกับ Collation) - บังคับ Case Sensitive:
REGEXP BINARYหรือ Collateutf8mb4_bin - บังคับ Case Insensitive:
REGEXPธรรมดา หรือ Collateutf8mb4_general_ci
Performance Note
REGEXP ไม่ใช้ Index (Full Table Scan) - ใช้กับตารางเล็ก หรือรวมกับ WHERE อื่นที่มี Index ก่อน
ตัวอย่างเพิ่มเติม
-- โทรศัพท์ไทย: 08x-xxx-xxxx หรือ 09x-xxx-xxxx
WHERE phone REGEXP '^0[89][0-9]-?[0-9]{3}-?[0-9]{4}$'
-- Email 简单 validation
WHERE email REGEXP '^[^@]+@[^@]+\.[^@]+$'
-- มีตัวเลขอย่างน้อย 1 ตัว
WHERE password REGEXP '[0-9]'
-- เฉพาะตัวอักษรและตัวเลข (Alphanumeric)
WHERE code REGEXP '^[a-zA-Z0-9]+$'