Jadi ini akan menjadi pertanyaan bodoh tahun ini tetapi saya perlu bertanya karena ini bukan pertama kalinya saya melewati ini. Lihatlah definisi tabel berikut:
Lihatlah kolom from_number
yang 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 VARCHAR
ini bukan tipe yang tepat untuk menyimpan informasi seperti ini - mungkin saya salah, Anda memberi tahu saya - jadi saya berpikir untuk mengganti INT
atau 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:
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
Jawaban:
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.
sumber
1-800-DBA-HELP
dengan digitnyaSebelumnya ditulis:
"Dengan MariaDB Anda bisa menggunakan
computed
bidang 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
CAP
s (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.
sumber
virtual
-generated
nilai tersebut. Saya berpikir sedang digunakanCONCAT
atau sesuatu yang lain tetapi tidak yakin sama sekali. Anda juga menyebutkan pencarian denganCAPS
menggunakanLIKE
dapatkah Anda memberikan contohnya juga? Bagaimana dengan kinerja kolom yang dihitung dengan cepat (virtual) vs persisted (
dihasilkan`)?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.
sumber
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.
sumber