Telefon numaralarını SQL Server 2005'te depolamak için hangi veri türü kullanılmalıdır?


85

Telefon numaralarını bir tabloya kaydetmem gerekiyor. Lütfen hangi veri türünü kullanmam gerektiğini önerin? Bekle. Lütfen yanıta basmadan önce okuyun ..

Satış Temsilcileri arama için bu alanı kullanabileceğinden (joker karakter araması dahil) bu alanın yoğun şekilde dizine eklenmesi gerekir.

Şu an itibariyle, telefon numaralarının birkaç formatta (bir XML dosyasından) gelmesini bekliyoruz. Tek tip bir biçime dönüştürmek için bir ayrıştırıcı yazmam gerekir mi? Milyonlarca veri olabilir (kopyalarla birlikte) ve bazı kaynak veriler her geldiğinde sunucu kaynaklarını (çok fazla ön işleme gibi etkinliklerde) bağlamak istemiyorum ..

Herhangi bir öneri bekliyoruz ..

Güncelleme: Kaynak veriler üzerinde kontrolüm yok. Sadece xml dosyasının yapısı standarttır. Xml ayrıştırmasını minimumda tutmak istiyor. Veritabanına girdikten sonra, erişim hızlı olmalıdır. Buralarda çılgınca bir öneri, Ajax Otomatik Tamamlama özelliğiyle bile çalışması gerektiğidir (böylece Satış Temsilcileri eşleşenleri hemen görebilir). AMAN TANRIM!!


1
Kaynak verileri ayrıştırmak / temizlemek için github.com/googlei18n/libphonenumber'ı kullanmak isteyebilirsiniz .
Nicholas Hirras

Yanıtlar:


60

Bu şunları içerir:

  • Uluslararası numaralar?
  • Uzantılar?
  • Gerçek numara dışında başka bilgiler ("bobby isteyin" gibi)?

Bunların hepsi hayır ise, 10 karakterlik bir alan kullanır ve sayısal olmayan tüm verileri çıkarırım. İlki evet ve diğer ikisi hayır ise, biri orijinal girdi için, diğeri ise tüm sayısal olmayan veriler şeritli ve indeksleme için kullanılan iki varchar (50) alanı kullanırdım. 2 veya 3 evet ise, uzantının veya diğer verilerin ne olduğunu belirlemek ve uygun şekilde ele almak için iki alan ve bir çeşit çılgın ayrıştırıcı yapacağımı düşünüyorum. Elbette 2. sütundan, dizini oluştururken fazladan karakterleri çıkaran dizinle bir şeyler yaparak kaçınabilirsiniz, ancak ben sadece ikinci bir sütun oluşturur ve muhtemelen bir tetikleyici ile karakterleri ayırırdım.

Güncelleme: AJAX sorununu çözmek için düşündüğünüz kadar kötü olmayabilir. Tabloda herhangi bir şeyin yapılmasının ana yolu bu gerçekçi ise, söylediğim gibi yalnızca ikinci bir sütundaki rakamları saklayın ve ardından o sütun için dizini kümelenmiş bir dizin yapın.


1
Tüm sorulara evet. Kaynak veriler üzerinde hiçbir kontrolüm yok. Orada bazı iyi öneriler. Teşekkürler.
John

13
Nitelikli toplama am, ancak 10 karakterlik bir alan İngiltere'deki çoğu cep telefonu numarasını ve İngiltere'deki birçok sabit hat numarasını kapsamaz. Telefon numaralarının gelecekte ölçeklendirilmesine izin vermek için ABD'de bile 10'dan fazlasına izin verir.
Jon Egerton

2
Neden decimal(10,0)yerine değil char?
Mr Anderson

1
İle çünkü @MrAnderson, ben bu olduğunu düşünüyorum decimal(10,0)var .. İhtiyacınız olduğunda sayı üzerine geri öndeki sıfıra
Mathijs Flietstra

Dünyanın neresinde olduğunuza bağlı olarak, Brad'in cevabının da vurguladığı gibi, 10 karakterin yeterince uzun olduğunu sanmıyorum .
Richardissimo

42

Varchar (15) kullanıyoruz ve kesinlikle bu alanda indeksliyoruz.

Bunun nedeni, uluslararası standartların 15 haneye kadar destekleyebilmesidir.

Wikipedia - Telefon Numarası Biçimleri

Uluslararası numaraları destekliyorsanız, sorgulara daha iyi filtre uygulamak için Dünya Bölge Kodu veya Ülke Kodunun ayrı olarak depolanmasını tavsiye ederim, böylece kendinizi ABD'ye geri gönderilen aramaları sınırlamak için telefon numarası alanlarınızı ayrıştırırken ve kontrol ederken bulmazsınız. misal


2
Bariz bir şeyi gözden kaçırıyor olabilirim, ancak sayısal verileri depolamak için bir karakter veri türü kullanmanın ne yararı var? Ve sayısal verilerden (örneğin sınırlayıcılar) daha fazlasını depoluyorsanız, biçimlendirilmiş 15 basamaklı bir sayıyı saklamak için 15 karakterden fazlasına ihtiyacınız olmaz mı?
FtDRbwLXw6

13
@drrcknlsn nedeni önde gelen sıfır - bazıları (bazı ülkelerde çoğu) sıfırla başlıyor
Manse

16
@drrcknlsn Bu yorumun 2 yaşında olduğunu biliyorum, ancak herhangi birinin yorumunuza rastlaması durumunda: Genellikle temel kural, matematik yapmak için anlamlı olan sayısal verileri depolamak için tamsayı veri türlerinin kullanılması gerektiğidir ve geri kalanı dizelerdir. Örneğin, iki telefon numarası eklemek veya SIN / SSN numaralarını çarpmak anlamsızdır, bu nedenle dizeler olarak saklanmaları gerekir.
Marco Pietro Cirillo

2
@drrcknlsn neden o decimal(10,0)zaman yerine char?
Mr Anderson

@ Bay A: Belki de telefon numarasının uzunluğu bir bölgeden / ülkeden diğerine değişebildiği için. Baştaki sıfırlarla doldurmak daha sonra ek bir ayrıştırma sorunu yaratır.
Trunk

5

Yalnızca ABD Telefon numaralarını kaydediyorsanız CHAR (10) kullanın. Rakamlar dışındaki her şeyi kaldırın.


3

Muhtemelen burada bariz olanı kaçırıyorum, ancak beklenen en uzun telefon numaranız için yeterince uzun bir varchar iyi çalışmaz mı?

Ben ise am belirgin bir şey eksik birisi işaret olsaydı, çok isterdim ...


3

Bir varchar (22) kullanırdım. Uzantılı bir Kuzey Amerika telefon numarasını tutacak kadar büyük. Tüm iğrenç '(', ')', '-' karakterlerini çıkarmak veya hepsini tek bir tek tip formatta ayrıştırmak istersiniz.

Alex


2

SQL Server 2005, indekslenmiş varchar alanlarındaki metne yönelik alt dize sorguları için oldukça iyi optimize edilmiştir. 2005 için, dizin alanları için dize özetine yeni istatistikler getirdiler. Bu, tam metin aramaya önemli ölçüde yardımcı olur.


2

varchar kullanmak oldukça verimsizdir. para türünü kullanın ve bunun dışında kullanıcı tarafından tanımlanmış bir "telefon numarası" türü oluşturun ve yalnızca pozitif sayılara izin vermek için bir kural oluşturun.

(19,4) olarak bildirirseniz, 4 basamaklı bir uzantı bile saklayabilir ve uluslararası numaralar için yeterince büyük olabilirsiniz ve yalnızca 9 bayt depolama alanı alırsınız. Ayrıca, dizinler hızlıdır.


2
Grats. -1. Dilbilgisi ve okumama - waht abuot% 233% - tam tablo taraması + dönüşümler? Bu standart bir problemdir ve standart bir çözümü vardır ve sayı DEĞİLDİR. Tüm biçimlendirmeyi çıkaran, btw.
TomTom

@TomTom moneyCevap olmadığını kabul etsem de, alt dizeye göre arama gerekli değilse (ve birçoğunun bir telefon numarasının sadece bir kısmına göre bir kayda bakmasına gerek olmadığını hayal ediyorum), kullanmanın nesi yanlış olur decimal(10,0)?
Mr Anderson

1

onları mümkün olduğunca standart hale getirmek için ön işleme ile nvarchar. Muhtemelen uzantıları ayıklayıp başka bir alanda saklamak isteyeceksiniz.


1

Verileri normalleştirin ve varchar olarak saklayın. Normalleştirme zor olabilir.

Bu tek seferlik bir vuruş olmalı. Sonra yeni bir kayıt geldiğinde, onu normalleştirilmiş verilerle karşılaştırıyorsunuz. Çok hızlı olmalı.


1

Birçok farklı telefon numarası biçimini (ve muhtemelen uzantılar vb. Gibi şeyleri dahil etmeniz) gerektiği için, onu diğer herhangi bir varchar gibi ele almak en mantıklısı olabilir. Girişi kontrol edebilseydiniz, verileri daha kullanışlı hale getirmek için bir takım yaklaşımlar uygulayabilirsiniz, ancak kulağa öyle gelmiyor.

Onu başka bir dizge olarak ele almaya karar verdiğinizde, kötü veriler, gizemli telefon numarası biçimlendirmesi ve ortaya çıkacak her şeyle ilgili kaçınılmaz sorunların üstesinden gelmeye odaklanabilirsiniz. Buradaki zorluk, veriler için iyi bir arama stratejisi oluşturmak olacak ve bence verileri nasıl depoladığınız değil. Toplama üzerinde hiçbir kontrolünüz olmayan büyük miktarda veri ile uğraşmak her zaman zor bir iştir.


1

Bilgileri ayıklamak ve işlemek için SSIS kullanın. Bu şekilde XML dosyalarının işlenmesini SQL Server'dan ayırmış olursunuz. Ayrıca gerekirse SSIS dönüşümlerini ayrı bir sunucuda da yapabilirsiniz. Telefon numaralarını VARCHAR kullanarak standart bir biçimde saklayın. Sayılardan ve belki de '+', '', '(', ')' ve '-' gibi birkaç karakterden bahsettiğimiz için NVARCHAR gereksiz olacaktır.



1

Uzantıları belirtmek için "x" veya "ext" kullanmak oldukça yaygındır, bu nedenle 15 karakter (tam uluslararası destek için) artı 3 ("ext" için) artı 4 (uzantının kendisi için) toplam 22 karaktere izin verin . Bu seni güvende tutmalı.

Alternatif olarak, herhangi bir "ext", "x" e çevrilerek maksimum 20 verecek şekilde girişte normalleştirin.


1

Telefon numarası gibi çok değerli öznitelikler için ayrı tablolara sahip olmak her zaman daha iyidir.

Kaynak veriler üzerinde herhangi bir kontrolünüz olmadığından, verileri XML dosyasından ayrıştırıp uygun biçime dönüştürebilirsiniz, böylece belirli bir ülkenin biçimleriyle herhangi bir sorun yaşanmaz ve ayrı bir tabloda saklayabilirsiniz, böylece indeksleme ve her ikisi de verimli olacaktır .

Teşekkür ederim.


Soruya tam olarak cevap vermiyor.
Smart Manoj


0

Bunun yerine uzun veri türünü kullanın .. int kullanmayın çünkü yalnızca -32,768 ile 32,767 arasındaki tam sayılara izin verir, ancak uzun veri türü kullanıyorsanız -2,147,483,648 ile 2,147,483,647 arasında sayılar ekleyebilirsiniz.


1
Bu sorun değil, ancak bazı numaralar ülke koduyla başladığından uluslararası numaraları ülke koduyla saklayamazsınız.Eg: 0094777123123, Biraz normal ifade doğrulamasına sahip bir varchar (15) alanı kullansanız iyi olur.
Bubashan_kushan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.