เมื่อต้องการค้นหาข้อมูลที่ขึ้นต้นด้วยตัวเลข (0-9) ให้ใช้ Regular Expression ด้วย Operator REGEXP และ Pattern '^[0-9]'
สร้างตารางและข้อมูล
mysql> create table DemoTable (Id varchar(200));
mysql> insert into DemoTable values('123User'),('_$123User'),('User123456'),('0000User'),('&^*User');
ข้อมูลในตาราง
+------------+ | Id | +------------+ | 123User | | _$123User | | User123456 | | 0000User | | &^*User | +------------+
คำสั่ง REGEXP หาขึ้นต้นตัวเลข
mysql> SELECT DISTINCT Id FROM DemoTable WHERE Id REGEXP '^[0-9]';
ผลลัพธ์
+----------+ | Id | +----------+ | 123User | | 0000User | +----------+
Pattern อธิบาย
^- จุดเริ่มต้นของสตริง (Anchor)[0-9]- Character Class ตัวเลข 0-9^[0-9]- ขึ้นต้นด้วยตัวเลข
Pattern เพิ่มเติมที่ใช้บ่อย
| Pattern | ความหมาย | Match Example |
|---|---|---|
^[0-9] | ขึ้นต้นตัวเลข | 1abc, 9xyz |
^[A-Za-z] | ขึ้นต้นตัวอักษร | abc, Xyz |
^[^0-9] | ขึ้นต้นไม่ใช่ตัวเลข | abc, _user |
^[0-9]+$ | เป็นตัวเลขทั้งหมด | 123, 0 |
^[0-9]{3} | ขึ้นต้น 3 ตัวเลข | 123abc, 999xyz |
^[\u0E00-\u0E7F] | ขึ้นต้นอักษรไทย (Unicode Range) | สวัสดี, ไทย |
REGEXP vs LIKE
- LIKE - เร็วกว่า, ใช้ Index ได้ (Prefix), รองรับ % และ _ เท่านั้น
- REGEXP - ยืดหยุ่นกว่า, ไม่ใช้ Index (Full Scan), รองรับ Regex เต็มรูปแบบ
- MySQL 8.0 ใช้ ICU Regex Engine (เร็วกว่า, รองรับ Unicode ดีกว่า)
Performance Tip
-- หากค้นหาบ่อย ให้สร้าง Generated Column + Index ALTER TABLE DemoTable ADD COLUMN starts_with_digit BOOLEAN GENERATED ALWAYS AS (Id REGEXP '^[0-9]') STORED, ADD INDEX idx_starts_digit (starts_with_digit); -- Query เร็วขึ้น SELECT * FROM DemoTable WHERE starts_with_digit = TRUE;