การค้นหาหมายเลขโทรศัพท์ใน MySQL

การค้นหาหมายเลขโทรศัพท์ที่ถูกเก็บไว้ในรูปแบบต่างๆ สามารถเป็นความท้าทายที่สำคัญเมื่อใช้ฐานข้อมูล SQL เช่น MySQL หากคุณเผชิญกับสถานการณ์ที่คุณต้องการค้นหาหมายเลขโทรศัพท์ที่จัดรูปแบบแตกต่างจากการเก็บบันทึก เช่น การค้นหา 07123456 เพื่อหา (07) 123 456 คุณไม่ได้อยู่คนเดียว บทความนี้จะอธิบายกลยุทธ์ที่ดีที่สุดในการจัดการกับปัญหานี้ทีละขั้นตอน

การเข้าใจความท้าทาย

ในหลายสถานการณ์ หมายเลขโทรศัพท์สามารถถูกจัดรูปแบบหลากหลายวิธี นี่คือตัวอย่างบางประการของการจัดเก็บหมายเลขโทรศัพท์ในฐานข้อมูล:

027 123 5644
021 393-5593
(07) 123 456
042123456

เมื่อคุณต้องการค้นหาหมายเลขโทรศัพท์โดยไม่คำนึงถึงรูปแบบ ความท้าทายอยู่ที่การกำจัดตัวอักษรที่ไม่ใช่ตัวเลขออก

ปัญหาทั่วไปกับการสอบถามมาตรฐาน

การใช้ฟังก์ชันสตริง MySQL แบบดั้งเดิมจะไม่ค่อยมีประสิทธิภาพในการกำจัดตัวอักษรและเปรียบเทียบหมายเลขโทรศัพท์เนื่องจากข้อจำกัดของ SQL:

  • การสอบถามที่เรียบง่ายอาจส่งผลให้การทำงานช้าลง โดยเฉพาะในชุดข้อมูลขนาดใหญ่
  • การใช้ Regular expressions จะมีข้อจำกัดในเวอร์ชัน MySQL เก่า

แนวทางแก้ไขที่ควรพิจารณา

ก่อนที่จะลงลึกในแนวทางแก้ไขเฉพาะ สิ่งสำคัญคือต้องประเมินขนาดของชุดข้อมูลของคุณ หากคุณมีข้อมูลไม่กี่ร้อยแถว วิธีที่ง่ายกว่านี้อาจเพียงพอ นี่คือลำดับขั้นตอนของแนวทางแก้ไขที่เป็นไปได้:

1. สร้างคอลัมน์แฮช

หนึ่งในแนวทางที่แนะนำคือการสร้างคอลัมน์เพิ่มเติมในตารางหมายเลขโทรศัพท์ของคุณที่เก็บเวอร์ชันที่ถูกแฮชของหมายเลขโทรศัพท์ โดยที่ตัวอักษรจัดรูปแบบทั้งหมดจะถูกกำจัดออก

  • ขั้นตอน:

    1. เพิ่มคอลัมน์ใหม่ เช่น phone_hash ไปยังตารางที่มีอยู่ของคุณ
    2. กรอกข้อมูลในคอลัมน์นี้โดยการกำจัดอักขระพิเศษทั้งหมดจากหมายเลขโทรศัพท์ต้นฉบับ
    3. ใช้ฟังก์ชันเช่น MD5() หรือ SHA1() ในการสร้างแฮช
  • ประโยชน์:

    • ความเร็ว: เมื่อแฮชแล้ว คุณสามารถทำดัชนีในคอลัมน์ phone_hash ใหม่ได้ ทำให้ MySQL สามารถดำเนินการค้นหาได้อย่างรวดเร็วโดยไม่ต้องทำการค้นหาทั้งตาราง
    • ความชัดเจน: วิธีการนี้ทำให้ได้ผลลัพธ์ที่มีโครงสร้างและบำรุงรักษาง่ายซึ่งนักพัฒนาที่จะมาทำงานในอนาคตสามารถเข้าใจได้ง่าย

2. การประมวลผลที่ฝั่งไคลเอนต์

หากชุดข้อมูลของคุณมีขนาดค่อนข้างเล็กและไม่คาดว่าจะเติบโตอย่างมีนัยสำคัญ คุณอาจพิจารณาการเรียกคืนหมายเลขโทรศัพท์ทั้งหมดจากฐานข้อมูลไปยังแอปพลิเคชันไคลเอนต์ จากนั้นดำเนินการค้นหาในระดับท้องถิ่น

  • ขั้นตอน:

    1. ดึงข้อมูลหมายเลขโทรศัพท์ทั้งหมด
    2. ใช้ฟังก์ชันในแอปพลิเคชันของคุณเพื่อกำจัดตัวอักษรที่ไม่ใช่ตัวเลข
    3. ดำเนินการค้นหาในหน่วยความจำ
  • ข้อดีและข้อเสีย:

    • วิธีการนี้อาจไม่ค่อยมีประสิทธิภาพเมื่อเปรียบเทียบกับการประมวลผลฝั่งเซิร์ฟเวอร์ในชุดข้อมูลขนาดใหญ่ แต่สามารถทำให้โค้ดเรียบง่ายและลดความซับซ้อนของฐานข้อมูล หากคุณมั่นใจในขนาดของชุดข้อมูล

3. การใช้ฟังก์ชัน SQL Replace (ไม่แนะนำสำหรับชุดข้อมูลขนาดใหญ่)

เพื่อความเข้าใจคุณยังสามารถใช้ฟังก์ชัน REPLACE ที่ซ้อนกันใน SQL query ได้โดยตรง:

SELECT * FROM people 
WHERE 
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(phonenumber, '(', ''), ')', ''), '-', ''), ' ', ''), '+', '') 
LIKE '123456';
  • อย่างไรก็ตามตามที่ได้กล่าวไปแล้ว วิธีการนี้อาจช้าในตารางใหญ่เนื่องจากไม่มีการทำดัชนีบนข้อมูลที่ถูกแปลง ทำให้ต้องทำการค้นหาทั้งตาราง

สรุป

แนวทางที่ดีที่สุดในการค้นหาหมายเลขโทรศัพท์ใน MySQL อาจแตกต่างกันไปตามข้อกำหนดเฉพาะของโปรเจ็กต์ของคุณ ขณะที่การใช้คอลัมน์แฮชมอบความชัดเจนและประสิทธิภาพ ชุดข้อมูลขนาดเล็กอาจเลือกการประมวลผลที่ฝั่งไคลเอนต์ ไม่ว่าคุณจะเลือกทางใด อย่าลืมพิจารณาถึงการเติบโตและความต้องการในการบำรุงรักษาในอนาคตเพื่อหลีกเลี่ยงความยุ่งยากสำหรับนักพัฒนาที่จะตามมา

หากคุณประสบปัญหาเรื่องประสิทธิภาพหรือข้อจำกัดของ SQL ควรพิจารณาทางเลือกของคุณอย่างรอบคอบเสมอ และเลือกแนวทางแก้ไขที่สร้างสมดุลระหว่างประสิทธิภาพและความบำรุงรักษา.