ใช้ REPLACE() เพื่อกำจัดอักขระที่ไม่ต้องการ (เช่น จุด) ก่อนเปรียบเทียบ
สร้างตารางตัวอย่าง
mysql> create table DemoTable (
Name varchar(40) ) ;
Query OK, 0 rows affected (0.63 sec)
เพิ่มข้อมูลตัวอย่าง
mysql> insert into DemoTable values('John.Smith'); Query OK, 1 row affected (0.30 sec)
mysql> insert into DemoTable values('Chris Brown'); Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('Chris.Brown'); Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('David Miller'); Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values('Chris.Taylor'); Query OK, 1 row affected (0.18 sec)
แสดงข้อมูลทั้งหมด
mysql> select *from DemoTable;
+--------------+ | Name | +--------------+ | John.Smith | | Chris Brown | | Chris.Brown | | David Miller | | Chris.Taylor | +--------------+ 5 rows in set (0.00 sec)
คิวรี่ค้นหา "Chris Brown" โดยละเว้นจุด
mysql> select *from DemoTable where replace(Name,'.','')='Chris Brown';
ผลลัพธ์ (เจอแค่ "Chris Brown" ตรงตัว และ "Chris.Brown" หลังลบจุด):
+-------------+ | Name | +-------------+ | Chris Brown | | Chris.Brown | +-------------+ 2 rows in set (0.00 sec)
คำอธิบาย
REPLACE(Name, '.', '')ลบจุดทุกตัวออกจาก Name ก่อนเปรียบเทียบ- จับคู่ได้ทั้ง "Chris Brown" (ไม่มีจุด) และ "Chris.Brown" (มีจุด)
- "Chris.Taylor" ไม่จับคู่ เพราะหลังลบจุดเป็น "ChrisTaylor"
ข้อจำกัดด้านประสิทธิภาพ
ใช้ฟังก์ชันบนคอลัมน์ (REPLACE(Name, ...)) ทำให้ ไม่ใช้ Index ได้ (Non-sargable)
แนวทางแก้ไข
- Normalize ข้อมูล: เก็บค่าที่ Clean ไว้ในคอลัมน์แยก (Generated Column)
ADD clean_name VARCHAR(40) GENERATED ALWAYS AS (REPLACE(Name, '.', '')) STORED- Full-Text Search: ใช้
MATCH() AGAINST()แทน - Application Layer: Clean ก่อน Query
ตัวอย่าง Generated Column (MySQL 5.7+)
ALTER TABLE DemoTable ADD COLUMN clean_name VARCHAR(40) GENERATED ALWAYS AS (REPLACE(Name, '.', '')) STORED; CREATE INDEX idx_clean_name ON DemoTable(clean_name); SELECT * FROM DemoTable WHERE clean_name = 'Chris Brown';