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

ดึงเฉพาะค่าที่มีอักขระพิเศษในคอลัมน์ MySQL ด้วย REGEXP

การค้นหาข้อมูลที่มีอักขระพิเศษ (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 ซับซ้อน