Datatype untuk nomor telepon: VARCHAR, INT atau BIGINT?

12

Jadi ini akan menjadi pertanyaan bodoh tahun ini tetapi saya perlu bertanya karena ini bukan pertama kalinya saya melewati ini. Lihatlah definisi tabel berikut:

masukkan deskripsi gambar di sini

Lihatlah kolom from_numberyang merupakan VARCHAR(45)hak sekarang tetapi ia akan menyimpan nomor telepon. Karena saya tidak tahu berapa banyak nomor telepon di seluruh dunia maka saya mencoba untuk menutupi hampir semua dari mereka. Saya ingin menjaga integritas basis data sebanyak mungkin jadi saya pikir VARCHARini bukan tipe yang tepat untuk menyimpan informasi seperti ini - mungkin saya salah, Anda memberi tahu saya - jadi saya berpikir untuk mengganti INTatau bahkan BIGINT.

Ketika saya mendefinisikan kolom di Workbench saya harus menentukan nomor antara tanda kurung ()tidak dalam semua kasus tetapi pada yang saya sebutkan sebelumnya saya harus. Jadi jika saya melakukan ini: BIGINT()Saya mendapat kesalahan ini:

masukkan deskripsi gambar di sini

Yang memandu saya untuk membaca sedikit tentang tipe MySQL ini di sini . Info dasarnya adalah ini:

Bilangan bulat besar. ... Rentang yang tidak ditandatangani adalah 0 hingga 18446744073709551615.

Yang membuat saya bertanya: nilai apa yang harus saya tetapkan untuk tanda kurung ketika saya mendefinisikan suatu BIGINT()tipe. (Saya menggunakan BIGINT karena saya tidak tahu apakah INT dapat menyimpan nomor sebanyak yang dimiliki ponsel - mungkin saya salah juga). Mana cara yang tepat untuk membuat | mendesain kolom di database MariaDB / MySQL?

Pokoknya saya ingin tahu pendapat Anda, pengalaman dan tentu saja saya ingin mendapat jawaban

Catatan: Saya menggunakan edisi terbaru MySQL Workbench untuk membuat diagram ER. Saya menggunakan juga MariaDB 10.0.x

ReynierPM
sumber

Jawaban:

13

Bagaimana Anda menangani nomor telepon dengan ekstensi, seperti "+ 1-000-000-0000 ext 1234"?

Catatan, "+" menunjukkan aturan panggilan internasional harus diterapkan; jadi dari Amerika Utara, sistem secara otomatis mengetahui "011" di depan panggilan internasional, dll.

Juga, bagaimana dengan nomor telepon seperti "1-800-DBA-HELP"?

Saya biasanya menyimpan nomor telepon sebagai teks. Karena itu, itu benar-benar tergantung seberapa penting kolom nomor telepon Anda. Jika Anda menjalankan dialer otomatis dari kolom itu, maka Anda benar-benar ingin memastikan bahwa hanya nomor yang disertakan, dan data tersebut mewakili nomor telepon yang terbentuk dengan baik.

Anda dapat memiliki kolom terpisah untuk ekstensi, dan nomor telepon yang memiliki teks, seperti contoh "1-800-DBA-HELP" yang saya berikan.

Max Vernon
sumber
Ya, mereka akan sangat kritis sehingga saya tidak akan membuat kesalahan di masa depan, berdasarkan bahwa saya hanya akan mengizinkan angka, apa saran Anda? Mudah untuk menambahkan kolom baru yang berisi nomor ekstensi atau saya ingin membuat orang memasukkan angka 1-800-DBA-HELPdengan digitnya
ReynierPM
Itu benar-benar tergantung pada kebutuhan Anda. Jika Anda perlu mempertahankan kemampuan pengenalan manusia, saya tentu ingin menyimpan angka berbasis teks di suatu tempat, mungkin di bidang teks. Jika Anda tidak peduli dengan bagian teks, maka jangan menyimpannya.
Max Vernon
1
INT tentu tidak cukup besar jika Anda menyimpan nomor penuh dengan kode negara. BIGINT mungkin cukup besar.
Max Vernon
1
Saya ingin setidaknya 20 digit.
Max Vernon
1
Dengan MariaDB Anda bisa menggunakan bidang yang dihitung untuk mengekstrak hanya digit untuk sebuah dialer otomatis. Mungkin di MySQL 5.7 (tidak yakin).
Vérace
2

Sebelumnya ditulis:

"Dengan MariaDB Anda bisa menggunakan computedbidang untuk mengekstrak hanya digit untuk dialer otomatis. Juga berfungsi untuk MySQL 5.7."

Menanggapi pertanyaan OP tentang ini ("bisakah kamu menjelaskan sedikit apa yang kamu katakan padaku?"), Di sini ada penjelasan.

Banyak sistem basis data kini telah memperkenalkan fitur ini. Ini adalah bidang yang dikenal dengan berbagai " computed", " virtual" atau " generated" yang diturunkan dari nilai di bidang lain. Kekuatan fitur ini akan bervariasi tergantung pada RDBMS Anda. Saya tahu bahwa Oracle, Firebird, MariaDB dan sekarang MySQL 5.7 memilikinya. Orang lain mungkin juga melakukannya.

Contoh mudahnya adalah memiliki kolom nama dan kolom terkomputasi yang "menyimpan" (ingat, mereka bisa virtual - yaitu dihitung dengan cepat, atau mereka dapat disimpan secara fisik di disk) nama keluarga sebagai semua ibu kota, dengan demikian membuat mencari lebih mudah. Dengan begitu Anda hanya perlu mencari di CAPs (menggunakan, katakanlah, LIKE), mengetahui bahwa data sedang dicari di [ computed| virtual| generated] bidang dalam teks kapital.

Konsep untuk MySQL 5.7 dijelaskan di sini dan di sini . Sudah di MariaDB untuk sedikit lebih lama dan konsepnya juga dijelaskan di sini . Beberapa kemungkinan penggunaan disarankan di sini , tetapi Anda benar-benar hanya dibatasi oleh imajinasi Anda. Mereka dapat dilihat sebagai pengganti yang nyaman (dan lebih rentan kesalahan) untuk pemicu.

Untuk kasus penggunaan khusus Anda, Anda dapat memperoleh nomor yang dapat diputar dari bidang teks "+" -> "00" (atau apa pun kode panggilan internasional Anda). Hanya pemikiran saja.

Vérace
sumber
Hebat, bisakah Anda meningkatkan sedikit pertanyaan dengan menambahkan beberapa pertanyaan? Maksud saya, saya mendapatkan konsep tetapi saya tidak yakin bagaimana cara menciptakan nilai virtual- generatednilai tersebut. Saya berpikir sedang digunakan CONCATatau sesuatu yang lain tetapi tidak yakin sama sekali. Anda juga menyebutkan pencarian dengan CAPSmenggunakan LIKEdapatkah Anda memberikan contohnya juga? Bagaimana dengan kinerja kolom yang dihitung dengan cepat ( virtual) vs persisted (dihasilkan`)?
ReynierPM
1

Hmm. Nomor telepon terbuat dari angka. Menggunakan varchar memungkinkan pengguna untuk menyimpan segala jenis pemformatan, dengan (atau tidak, dengan - atau. Dan dengan cepat membuat kekacauan dengan data Anda. Format # telepon bergantung pada negara, topeng harus dikaitkan dengan negara. Ekstensi adalah ekstensi dan opsional, jadi harus disimpan dalam "bidang ekstensi". (int juga). Untuk 1-800-DBA-BANTUAN, saya akan mengonversinya dengan cepat dan menyimpan nomor aktual. Jika Anda benar-benar membutuhkannya ponsel yang dapat dibaca manusia #, simpan di bidang varchar yang terpisah.

greenlitmysql
sumber
1

Saya biasanya menyimpan Nomor Telepon di teks sederhana . Memformat dan menampilkan biarkan kode klien.

Di sini, lebih dari, bagaimana Anda menyimpan? apa yang akan Anda lakukan dengan nomor telepon itu sangat penting.

Jika bisnis Anda ingin melakukan panggilan keluar dari sistem Anda, aplikasi hanya akan mengekstraksi angka. Jika bisnis Anda ingin melakukan panggilan internasional , simpan kode negara dan kode area di kolom terpisah.

Jika bisnis Anda ingin melaporkan , aplikasi akan memformat dan menampilkan dengan ekstensi dan angka secara terpisah.

Dari pengertian saya, mendesain model data universal untuk nomor telepon bukanlah ide yang baik. Setiap negara memiliki angka, ekstensi, dan kode area berbeda selain dari kode negara. Juga, saya jadi tahu, beberapa negara tidak memiliki kode area.

Ini mungkin tidak menjawab pertanyaan Anda, tetapi akan membantu memperluas pemahaman kami. Terima kasih.

rathishDBA
sumber