MySQL’de Telefon Numaralarını Arama

Farklı biçimlerde saklanan telefon numaralarını aramak, MySQL gibi SQL veritabanları kullanırken büyük bir zorluk çıkarabilir. Saklandıkları şekilde farklı biçimlerde telefon numaralarını aramanız gereken bir durumla karşılaştıysanız, örneğin (07) 123 456 bulmak için 07123456 arıyorsanız, yalnız değilsiniz. Bu blog yazısında bu sorunu adım adım çözmek için en iyi stratejileri açıklayacağız.

Zorluğu Anlamak

Birçok durumda, telefon numaraları sayısız şekilde biçimlendirilmiş olabilir. Bir veritabanında telefon numaralarının saklanma biçimlerine bazı örnekler:

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

Biçimlendirmeyi dikkate almadan bir telefon numarasını aramanız gerektiğinde, zorluk, sayısal olmayan karakterleri çıkarmaya bağlıdır.

Standart Sorgularla İlgili Yaygın Sorunlar

Geleneksel MySQL string fonksiyonları, karakterleri çıkarmak ve telefon numaralarını karşılaştırmak için çok etkili olmayacaktır çünkü SQL’in sınırlamaları vardır:

  • Basit bir sorgu, özellikle daha büyük veri setlerinde yavaş bir performansa sebep olabilir.
  • Eski MySQL sürümlerinde düzenli ifadelerin kapsamı sınırlıdır.

Düşünülebilecek Çözümler

Spesifik çözümlere geçmeden önce, veri setinizin boyutunu değerlendirmek önemlidir. Eğer birkaç yüz satırla ilgileniyorsanız, daha basit bir yöntem yeterli olabilir. İşte olası çözümlerin bir dökümü:

1. Hash Sütunu Oluşturma

Önerilen bir yaklaşım, telefon numarası tablonuzda, tüm biçimlendirme karakterlerinin çıkarıldığı bir hashed versiyonunu saklayan ek bir sütun oluşturmaktır.

  • Adımlar:

    1. Mevcut tabloya, diyelim ki phone_hash adında yeni bir sütun ekleyin.
    2. Orijinal telefon numarasından tüm özel karakterleri kaldırarak bu sütunu doldurun.
    3. MD5() veya SHA1() gibi bir fonksiyon kullanarak bir hash oluşturun.
  • Faydalar:

    • Hız: Hash’lenmiş bir şekilde bu yeni phone_hash sütununu indeksleyebilir, böylece MySQL’in tablo taraması yapmadan hızlı bir şekilde arama yapmasını sağlayabilirsiniz.
    • Açıklık: Bu yöntem, gelecekteki geliştiricilerin kolayca anlayabileceği yapılandırılmış ve sürdürülebilir bir çözüm sağlar.

2. İstemci Tarafı İşleme Uygulama

Eğer veri setiniz oldukça küçükse ve önemli ölçüde büyümesi beklenmiyorsa, veritabanından tüm telefon numaralarını istemci uygulamasına almayı ve ardından aramayı yerel olarak gerçekleştirmeyi düşünebilirsiniz.

  • Adımlar:

    1. Tüm telefon numarası veri setini alın.
    2. Uygulamanızda sayısal olmayan karakterleri çıkartacak bir fonksiyon uygulayın.
    3. Bellekte aramayı gerçekleştirin.
  • Artılar ve Eksiler:

    • Bu, daha büyük veri setleri için sunucu tarafı işleme göre daha az verimli olabilir, ancak kodu basitleştirebilir ve veri tabanı karmaşıklığını azaltabilir, eğer veri setinin boyutuna güveniyorsanız.

3. SQL Replace Fonksiyonları Kullanma (Daha Büyük Veri Setleri için Önerilmez)

Anlayış amaçlı olarak, SQL sorgularınız içinde iç içe REPLACE fonksiyonlarını doğrudan kullanabilirsiniz:

SELECT * FROM people 
WHERE 
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(phonenumber, '(', ''), ')', ''), '-', ''), ' ', ''), '+', '') 
LIKE '123456';
  • Ancak, önceki notlarımıza göre, bu yaklaşım, dönüştürülmüş veriler üzerinde indeksleme olmadığından daha büyük tablolarda yavaş olabilir ve bu durum tam tablo taramalarına neden olur.

Sonuç

MySQL’de telefon numaralarını aramak için en iyi çözüm, projenizin spesifik gereksinimlerine bağlı olarak değişebilir. Hash’lenmiş bir sütun kullanmak açıklık ve performans sunarken, daha küçük veri setleri istemci tarafı işleme uygulayabilir. Hangi yolu seçerseniz seçin, gelecekteki büyüme ve bakım ihtiyaçlarınızı göz önünde bulundurarak ilerleyin, böylece sonraki geliştiriciler için komplikasyonlardan kaçının.

Eğer performans sorunları veya SQL sınırlamaları ile mücadele ediyorsanız, her zaman seçeneklerinizi dikkatlice değerlendirin ve verimlilik ile sürdürülebilirliği dengeleyen bir çözüm seçin.