การค้นหาหมายเลขโทรศัพท์ใน MySQL
การค้นหาหมายเลขโทรศัพท์ที่ถูกเก็บไว้ในรูปแบบต่างๆ สามารถเป็นความท้าทายที่สำคัญเมื่อใช้ฐานข้อมูล SQL เช่น MySQL หากคุณเผชิญกับสถานการณ์ที่คุณต้องการค้นหาหมายเลขโทรศัพท์ที่จัดรูปแบบแตกต่างจากการเก็บบันทึก เช่น การค้นหา 07123456
เพื่อหา (07) 123 456
คุณไม่ได้อยู่คนเดียว บทความนี้จะอธิบายกลยุทธ์ที่ดีที่สุดในการจัดการกับปัญหานี้ทีละขั้นตอน
การเข้าใจความท้าทาย
ในหลายสถานการณ์ หมายเลขโทรศัพท์สามารถถูกจัดรูปแบบหลากหลายวิธี นี่คือตัวอย่างบางประการของการจัดเก็บหมายเลขโทรศัพท์ในฐานข้อมูล:
027 123 5644
021 393-5593
(07) 123 456
042123456
เมื่อคุณต้องการค้นหาหมายเลขโทรศัพท์โดยไม่คำนึงถึงรูปแบบ ความท้าทายอยู่ที่การกำจัดตัวอักษรที่ไม่ใช่ตัวเลขออก
ปัญหาทั่วไปกับการสอบถามมาตรฐาน
การใช้ฟังก์ชันสตริง MySQL แบบดั้งเดิมจะไม่ค่อยมีประสิทธิภาพในการกำจัดตัวอักษรและเปรียบเทียบหมายเลขโทรศัพท์เนื่องจากข้อจำกัดของ SQL:
- การสอบถามที่เรียบง่ายอาจส่งผลให้การทำงานช้าลง โดยเฉพาะในชุดข้อมูลขนาดใหญ่
- การใช้ Regular expressions จะมีข้อจำกัดในเวอร์ชัน MySQL เก่า
แนวทางแก้ไขที่ควรพิจารณา
ก่อนที่จะลงลึกในแนวทางแก้ไขเฉพาะ สิ่งสำคัญคือต้องประเมินขนาดของชุดข้อมูลของคุณ หากคุณมีข้อมูลไม่กี่ร้อยแถว วิธีที่ง่ายกว่านี้อาจเพียงพอ นี่คือลำดับขั้นตอนของแนวทางแก้ไขที่เป็นไปได้:
1. สร้างคอลัมน์แฮช
หนึ่งในแนวทางที่แนะนำคือการสร้างคอลัมน์เพิ่มเติมในตารางหมายเลขโทรศัพท์ของคุณที่เก็บเวอร์ชันที่ถูกแฮชของหมายเลขโทรศัพท์ โดยที่ตัวอักษรจัดรูปแบบทั้งหมดจะถูกกำจัดออก
-
ขั้นตอน:
- เพิ่มคอลัมน์ใหม่ เช่น
phone_hash
ไปยังตารางที่มีอยู่ของคุณ - กรอกข้อมูลในคอลัมน์นี้โดยการกำจัดอักขระพิเศษทั้งหมดจากหมายเลขโทรศัพท์ต้นฉบับ
- ใช้ฟังก์ชันเช่น
MD5()
หรือSHA1()
ในการสร้างแฮช
- เพิ่มคอลัมน์ใหม่ เช่น
-
ประโยชน์:
- ความเร็ว: เมื่อแฮชแล้ว คุณสามารถทำดัชนีในคอลัมน์
phone_hash
ใหม่ได้ ทำให้ MySQL สามารถดำเนินการค้นหาได้อย่างรวดเร็วโดยไม่ต้องทำการค้นหาทั้งตาราง - ความชัดเจน: วิธีการนี้ทำให้ได้ผลลัพธ์ที่มีโครงสร้างและบำรุงรักษาง่ายซึ่งนักพัฒนาที่จะมาทำงานในอนาคตสามารถเข้าใจได้ง่าย
- ความเร็ว: เมื่อแฮชแล้ว คุณสามารถทำดัชนีในคอลัมน์
2. การประมวลผลที่ฝั่งไคลเอนต์
หากชุดข้อมูลของคุณมีขนาดค่อนข้างเล็กและไม่คาดว่าจะเติบโตอย่างมีนัยสำคัญ คุณอาจพิจารณาการเรียกคืนหมายเลขโทรศัพท์ทั้งหมดจากฐานข้อมูลไปยังแอปพลิเคชันไคลเอนต์ จากนั้นดำเนินการค้นหาในระดับท้องถิ่น
-
ขั้นตอน:
- ดึงข้อมูลหมายเลขโทรศัพท์ทั้งหมด
- ใช้ฟังก์ชันในแอปพลิเคชันของคุณเพื่อกำจัดตัวอักษรที่ไม่ใช่ตัวเลข
- ดำเนินการค้นหาในหน่วยความจำ
-
ข้อดีและข้อเสีย:
- วิธีการนี้อาจไม่ค่อยมีประสิทธิภาพเมื่อเปรียบเทียบกับการประมวลผลฝั่งเซิร์ฟเวอร์ในชุดข้อมูลขนาดใหญ่ แต่สามารถทำให้โค้ดเรียบง่ายและลดความซับซ้อนของฐานข้อมูล หากคุณมั่นใจในขนาดของชุดข้อมูล
3. การใช้ฟังก์ชัน SQL Replace (ไม่แนะนำสำหรับชุดข้อมูลขนาดใหญ่)
เพื่อความเข้าใจคุณยังสามารถใช้ฟังก์ชัน REPLACE
ที่ซ้อนกันใน SQL query ได้โดยตรง:
SELECT * FROM people
WHERE
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(phonenumber, '(', ''), ')', ''), '-', ''), ' ', ''), '+', '')
LIKE '123456';
- อย่างไรก็ตามตามที่ได้กล่าวไปแล้ว วิธีการนี้อาจช้าในตารางใหญ่เนื่องจากไม่มีการทำดัชนีบนข้อมูลที่ถูกแปลง ทำให้ต้องทำการค้นหาทั้งตาราง
สรุป
แนวทางที่ดีที่สุดในการค้นหาหมายเลขโทรศัพท์ใน MySQL อาจแตกต่างกันไปตามข้อกำหนดเฉพาะของโปรเจ็กต์ของคุณ ขณะที่การใช้คอลัมน์แฮชมอบความชัดเจนและประสิทธิภาพ ชุดข้อมูลขนาดเล็กอาจเลือกการประมวลผลที่ฝั่งไคลเอนต์ ไม่ว่าคุณจะเลือกทางใด อย่าลืมพิจารณาถึงการเติบโตและความต้องการในการบำรุงรักษาในอนาคตเพื่อหลีกเลี่ยงความยุ่งยากสำหรับนักพัฒนาที่จะตามมา
หากคุณประสบปัญหาเรื่องประสิทธิภาพหรือข้อจำกัดของ SQL ควรพิจารณาทางเลือกของคุณอย่างรอบคอบเสมอ และเลือกแนวทางแก้ไขที่สร้างสมดุลระหว่างประสิทธิภาพและความบำรุงรักษา.