การค้นหาข้อมูลที่มีอักขระพิเศษ (Non-Alphanumeric) ด้วย REGEXP
ใช้ Pattern [^a-zA-Z0-9] (Negated Character Class) เพื่อจับคู่อักขระที่ **ไม่ใช่** ตัวอักษรอังกฤษและตัวเลข
Syntax
SELECT * FROM table_name WHERE column_name REGEXP '[^a-zA-Z0-9]';
ตัวอย่าง: ค้นหา SubjectCode ที่มีอักขระพิเศษ
สร้างตารางและเพิ่มข้อมูลผสม:
mysql> CREATE TABLE DemoTable (SubjectCode VARCHAR(100));
Query OK, 0 rows affected (0.89 sec)
mysql> INSERT INTO DemoTable VALUES
('Java899@22'), ('C#'), ('~Python232'), ('MongoDB%'), ('C123456');
Query OK, 5 rows affected
ข้อมูลทั้งหมด:
mysql> SELECT * FROM DemoTable;
+-------------+ | SubjectCode | +-------------+ | Java899@22 | | C# | | ~Python232 | | MongoDB% | | C123456 | +-------------+ 5 rows in set (0.00 sec)
ค้นหาที่มีอักขระพิเศษ (ไม่ใช่ A-Z, a-z, 0-9):
mysql> SELECT * FROM DemoTable WHERE SubjectCode REGEXP '[^a-zA-Z0-9]';
+-------------+ | SubjectCode | +-------------+ | Java899@22 | -- มี @ | C# | -- มี # | ~Python232 | -- มี ~ | MongoDB% | -- มี % +-------------+ 4 rows in set (0.00 sec)
C123456 ไม่มีอักขระพิเศษ → ไม่ถูก Select
Pattern แบบละเอียดกว่า (รวม Underscore, Space, Thai)
| Pattern | จับคู่ | ตัวอย่าง |
|---|---|---|
[^a-zA-Z0-9] | Non-Alphanumeric (ASCII) | @ # $ % ~ ! ฯลฯ |
[^a-zA-Z0-9_] | Non-Alphanumeric + Underscore | เหมือนข้างบน แต่ _ ผ่าน |
[^[:alnum:]] | POSIX Class: Non-Alphanumeric | รวม Unicode ขึ้นกับ Collation |
[^a-zA-Z0-9가-힣] | ยกเว้น Korean | ต้องใช้ Collation รองรับ |
MySQL 8.0+: REGEXP_REPLACE (ลบอักขระพิเศษ)
SELECT REGEXP_REPLACE(SubjectCode, '[^a-zA-Z0-9]', '') AS Cleaned FROM DemoTable;
+-----------+ | Cleaned | +-----------+ | Java89922 | | C | | Python232 | | MongoDB | | C123456 | +-----------+
ประสิทธิภาพ
- REGEXP ไม่ใช้ Index (Full Table Scan)
- ตารางใหญ่ → ใช้ Generated Column + Index หรือ Fulltext Search
- Pattern เรียบง่าย เร็วกว่า Pattern ซับซ้อน