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:
- Mevcut tabloya, diyelim ki
phone_hash
adında yeni bir sütun ekleyin. - Orijinal telefon numarasından tüm özel karakterleri kaldırarak bu sütunu doldurun.
MD5()
veyaSHA1()
gibi bir fonksiyon kullanarak bir hash oluşturun.
- Mevcut tabloya, diyelim ki
-
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.
- Hız: Hash’lenmiş bir şekilde bu yeni
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:
- Tüm telefon numarası veri setini alın.
- Uygulamanızda sayısal olmayan karakterleri çıkartacak bir fonksiyon uygulayın.
- 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.