การค้นหาสตริงที่ประกอบด้วย a-z, A-Z และ 0-9 ครบถ้วนด้วย REGEXP BINARY
ใช้ REGEXP BINARY (Case Sensitive) ร่วมกับ AND เพื่อตรวจสอบแต่ละกลุ่มตัวอักษรแยกกัน
Syntax
SELECT * FROM table_name WHERE column REGEXP BINARY '[a-z]' AND column REGEXP BINARY '[A-Z]' AND column REGEXP BINARY '[0-9]';
ตัวอย่างการใช้งาน
สร้างตารางและเพิ่มข้อมูล UserId หลากหลายรูปแบบ:
mysql> CREATE TABLE DemoTable738 (UserId VARCHAR(100));
Query OK, 0 rows affected (0.81 sec)
mysql> INSERT INTO DemoTable738 VALUES
('John'), ('sAm456'), ('98Carol'), ('67david'), ('69MIKE');
Query OK, 5 rows affected
ข้อมูลทั้งหมด:
mysql> SELECT * FROM DemoTable738;
+---------+ | UserId | +---------+ | John | | sAm456 | | 98Carol | | 67david | | 69MIKE | +---------+ 5 rows in set (0.00 sec)
ค้นหาที่มี **ตัวเล็ก, ตัวใหญ่, ตัวเลข ครบ 3 อย่าง**:
mysql> SELECT * FROM DemoTable738 WHERE UserId REGEXP BINARY '[A-Z]' AND UserId REGEXP BINARY '[a-z]' AND UserId REGEXP BINARY '[0-9]';
+---------+ | UserId | +---------+ | sAm456 | | 98Carol | +---------+ 2 rows in set (0.03 sec)
อธิบาย:
John- มีตัวใหญ่/เล็ก แต่ **ไม่มีตัวเลข** → ตัดsAm456- มี s(เล็ก) A(ใหญ่) m(เล็ก) 456(เลข) → **ผ่าน**98Carol- มี 98(เลข) C(ใหญ่) arol(เล็ก) → **ผ่าน**67david- มี 67(เลข) david(เล็ก) **ไม่มีตัวใหญ่** → ตัด69MIKE- มี 69(เลข) MIKE(ใหญ่) **ไม่มีตัวเล็ก** → ตัด
Regex Pattern อื่นๆ สำหรับ Validation
| เงื่อนไข | Regex |
|---|---|
| อย่างน้อย 1 ตัวเล็ก, 1 ตัวใหญ่, 1 ตัวเลข, 8 ตัวขึ้นไป | ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$ (ต้องใช้ PCRE - MySQL 8.0+ REGEXP) |
| Alphanumeric เท่านั้น | ^[A-Za-z0-9]+$ |
| เริ่มต้นตัวอักษร ตามด้วยอะไรก็ได้ | ^[A-Za-z].*$ |
| ไม่มีอักขระพิเศษ | ^[A-Za-z0-9_]+$ |
หมายเหตุ MySQL Regex
- MySQL ใช้ POSIX Regex (ไม่ใช่ PCRE) → ไม่รองรับ Lookahead
(?=...)ในเวอร์ชันเก่า - MySQL 8.0+ ใช้ ICU Regex รองรับ Lookahead/Lookbehind
BINARYทำให้ Case Sensitive (Default คือ Case Insensitive ตาม Collation)RLIKE= Alias ของREGEXP