Telefon numarası için veri türü: VARCHAR, INT veya BIGINT?


12

Yani bu yılın kukla sorusu olacak ama sormam gerekiyor, çünkü bunu ilk kez geçmiyorum. Aşağıdaki tablo tanımına bir göz atın:

resim açıklamasını buraya girin

Şu anda sağ from_numberolan sütuna bir göz atın, VARCHAR(45)ancak bir telefon numarası tutacaktır. Bir telefonun tüm dünyada kaç numaraya sahip olabileceğini bilmediğimden, neredeyse hepsini kapsamaya çalışıyorum. Ben veritabanı bütünlüğünü mümkün olduğunca tutmak istiyorum, bu yüzden VARCHARbu tür bilgileri tutmak için uygun bir tür olmadığını düşünüyorum - belki de yanılıyorum, sen söyle bana - bu yüzden değişiklik INTya da hatta düşünüyorum BIGINT.

Workbench'te bir sütun tanımlarken (), tüm durumlarda değil, daha önce bahsettiğimlerde parantezler arasındaki sayıyı belirtmeliyim . Eğer bunu yaparsam: BIGINT()Bu hatayı aldım:

resim açıklamasını buraya girin

Bu MySQL türü hakkında biraz okumak için bana yol Hangi burada . Temel olarak bilgi şudur:

Büyük bir tamsayı. ... İmzasız aralık 0 ila 18446744073709551615'dir.

Hangi bana sormak: bir BIGINT()tür tanımlarken parantez için hangi değeri ayarlamalıyım . (Ben BIGINT kullanıyorum çünkü INT'nin bir telefonun sahip olabileceği kadar sayı tutabildiğini bilmiyorum - belki de yanılıyorum). MariaDB / MySQL veritabanlarında bir sütun tasarlamak için doğru yol hangisidir?

Her neyse, fikrinizi, deneyiminizi bilmek istiyorum ve elbette bir cevap almak istiyorum

Not: ER diyagramını oluşturmak için MySQL Workbench son sürümünü kullanıyorum. Ayrıca MariaDB 10.0.x kullanıyorum


Yanıtlar:


13

"+ 1-000-000-0000 dahili 1234" gibi dahili bir telefon numarasını nasıl ele alırsınız?

"+", Uluslararası arama kurallarının uygulanması gerektiğini belirtir; böylece Kuzey Amerika'dan, sistem otomatik olarak uluslararası aramaların önünde "011" i bilir.

Ayrıca, "1-800-DBA-HELP" gibi telefon numaraları ne olacak?

Genellikle telefon numaralarını metin olarak depolardım. Bunu söyledikten sonra, gerçekten telefon numarası sütununuzun ne kadar kritik olduğuna bağlıdır. Bu sütundan otomatik çeviriciler çalıştırıyorsanız, yalnızca sayıların dahil edildiğinden ve verilerin iyi biçimlendirilmiş telefon numaralarını gösterdiğinden emin olmak istersiniz.

Uzantılar için ayrı sütunlar ve sağladığım "1-800-DBA-HELP" örneği gibi metin içeren telefon numaraları olabilir.


Evet, kritik olacaklar, bu yüzden gelecekte sadece hatalara izin vereceğime dayanarak herhangi bir hata yapmayacağım, öneriniz nedir? Dahili numarayı tutun yeni bir sütun eklemek için kolay mı yoksa ben insanların sayıları girmek yapmak istiyorum 1-800-DBA-HELPo hanesi ile
ReynierPM

Gerçekten gereksinimlerinize bağlıdır. İnsanların tanınabilirliğini korumanız gerekiyorsa, metin tabanlı sayıları bir yerde, muhtemelen bir metin alanında tutmak istiyorum. Metin kısmını önemsemiyorsanız, saklamayın.
Max Vernon

1
INT, tam numarayı ülke koduyla depolarsanız kesinlikle yeterince büyük değildir. BIGINT muhtemelen yeterince büyük.
Max Vernon

1
En az 20 hane istiyorum.
Max Vernon

1
MariaDB ile, otomatik çevirici için yalnızca rakamları ayıklamak üzere bilgisayarlı bir alan kullanabilirsiniz. Belki MySQL 5.7'de (emin değilim).
Vérace

2

Daha önce yazılmıştı:

"MariaDB ile computedbir otomatik çevirici için sadece rakam ayıklamak için bir alan kullanabilirsiniz . Ayrıca MySQL 5.7 için çalışır."

OP'nin bu konudaki sorusuna yanıt olarak ("bana ne söylediğinizi biraz açıklayabilir misiniz?"), İşte bir açıklama.

Birçok veritabanı sistemi şimdi bu özelliği tanıttı. Bunlar, " computed", " virtual" veya " generated" olarak bilinen ve diğer alanlardaki değerlerden türetilen alanlardır. Bu özelliğin gücü RDBMS'nize bağlı olarak değişir. Oracle, Firebird, MariaDB ve şimdi MySQL 5.7'de bunların olduğunu biliyorum. Diğerleri de muhtemelen yapar.

Kolay bir örnek, bir soyadı sütununa sahip olmak ve tüm başkentleri gibi soyadı "depolayan" (hatırlayın, sanal olabilir - yani hesaplanır veya fiziksel olarak diskte saklanabilir) hesaplanmış bir sütuna sahip olmak, böylece daha kolay arama. Geriye sadece arama zorunda yolu CAP(diyelim kullanarak s LIKEveri varlık arandı bilerek) [ computed| virtual| generated] alanı büyük harfle yazılmıştır.

MySQL 5.7 konsepti burada ve burada açıklanmaktadır . MariaDB'de biraz daha uzun süredir var ve konsept burada da açıklanıyor . Bazı olası kullanımları önerilmektedir burada , ama sen gerçekten sadece hayal gücü ile sınırlıdır. Tetikleyiciler için uygun (ve daha az hataya eğilimli) bir ikame olarak görülebilirler.

Özel kullanım durumunuz için, "+" -> "00" metin alanından (veya uluslararası arama kodunuz ne olursa olsun) aranabilir bir numara türetebilirsiniz. Sadece bir düşünce.


Harika, bazı sorular ekleyerek sorunuzu biraz geliştirebilir misiniz? Yani konsepti aldım ama virtualya da generateddeğerleri nasıl oluşturacağımdan emin değilim . Kullanımda olduğunu düşünüyorum CONCATya da başka bir şey ama emin değilim. Ayrıca CAPSkullanarak bir arama söz de LIKEbuna örnek verebilir misiniz? Peki hesaplanan sütunların performansı hakkında ( virtual) vs persisted (oluşturulan`)?
ReynierPM

1

Hmm. Telefon numaraları numaralardan yapılır. Varchar kullanmak, kullanıcının - veya ile birlikte (veya değil, herhangi bir formatı depolamasına izin verir ve verilerinizle hızlı bir şekilde karışıklık yaratır.Telefon # formatı "ülkeye" bağlıdır, maske ülkeye bağlı olmalıdır. bir uzantıdır ve isteğe bağlıdır, bu yüzden bir "uzatma alanında" saklanmalıdır. (int ayrıca). 1-800-DBA-HELP için, bunu anında dönüştürür ve gerçek numarayı saklarım. insan tarafından okunabilir telefon #, ayrı varchar alanında saklayın.


1

Telefon Numaralarını genellikle basit metin olarak saklarım . Biçimlendirme ve görüntüleme, istemci koduna bırakılır.

Burada, nasıl sakladığınızdan daha fazlası? bu telefon numarası ile ne yapacağınız gerçekten önemlidir.

İşletmeniz sisteminizden giden aramalar yapmak istiyorsa , uygulama yalnızca numaralar çıkarır. İşletmeniz uluslararası arama yapmak istiyorsa , ülke kodunu ve alan kodunu ayrı sütunlarda saklayın.

İşletmeniz raporlama yapmak istiyorsa uygulama, uzantı ve numaralarla ayrı olarak biçimlendirilir ve görüntülenir.

Anladığım kadarıyla, telefon numarası için evrensel veri modeli tasarlamak iyi bir fikir değil. Her ülke, ülke kodu dışında farklı numaralara, uzantılara ve alan kodlarına sahiptir. Ayrıca, bazı ülkelerin alan kodları olmadığını biliyorum .

Bu, sorunuza cevap vermeyebilir, ancak anlayışımızı genişletmeye yardımcı olacaktır. Teşekkür ederim.

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.