Apa struktur data yang baik untuk menyimpan nomor telepon di bidang database? Saya mencari sesuatu yang cukup fleksibel untuk menangani nomor internasional, dan juga sesuatu yang memungkinkan berbagai bagian nomor dipertanyakan secara efisien.
Sunting: Hanya untuk memperjelas kasus penggunaan di sini: Saat ini saya menyimpan nomor dalam satu bidang varchar, dan saya meninggalkannya tepat saat pelanggan memasukkannya. Kemudian, ketika nomor tersebut dibutuhkan oleh kode, saya menormalkannya. Masalahnya adalah jika saya ingin menanyakan beberapa juta baris untuk menemukan nomor telepon yang cocok, ini melibatkan fungsi, seperti
where dbo.f_normalizenum(num1) = dbo.f_normalizenum(num2)
yang sangat tidak efisien. Juga kueri yang mencari hal-hal seperti kode area menjadi sangat rumit bila hanya berupa satu bidang varchar.
[Sunting]
Orang-orang telah memberikan banyak saran bagus di sini, terima kasih! Sebagai pembaruan, inilah yang saya lakukan sekarang: Saya masih menyimpan angka persis seperti yang dimasukkan, di bidang varchar, tetapi alih-alih menormalkan hal-hal pada waktu kueri, saya memiliki pemicu yang melakukan semua itu saat catatan dimasukkan atau diperbarui. Jadi saya memiliki ints atau bigints untuk setiap bagian yang perlu saya kueri, dan bidang tersebut diindeks untuk membuat kueri berjalan lebih cepat.
Jawaban:
Pertama, di luar kode negara, tidak ada standar yang sebenarnya. Hal terbaik yang dapat Anda lakukan adalah mengenali, berdasarkan kode negara, negara mana dari nomor telepon tertentu dan menangani sisa nomor tersebut sesuai dengan format negara tersebut.
Namun secara umum, peralatan telepon dan semacamnya distandarisasi sehingga Anda hampir selalu dapat memecah nomor telepon tertentu menjadi komponen berikut
Dengan metode ini Anda berpotensi dapat memisahkan nomor sehingga Anda dapat menemukan, misalnya, orang yang mungkin dekat satu sama lain karena memiliki kode negara, wilayah, dan pertukaran yang sama. Dengan ponsel itu bukan lagi sesuatu yang bisa Anda andalkan.
Selanjutnya, di dalam setiap negara ada standar yang berbeda. Anda selalu dapat bergantung pada (AAA) EEE-LLLL di AS, tetapi di negara lain Anda mungkin memiliki pertukaran di kota-kota (AAA) EE-LLL, dan hanya nomor baris di daerah pedesaan (AAA) LLLL. Anda harus mulai dari atas pada pohon dari beberapa bentuk, dan memformatnya sesuai informasi yang Anda miliki. Misalnya, kode negara 0 memiliki format yang diketahui untuk sisa nomornya, tetapi untuk kode negara 5432 Anda mungkin perlu memeriksa kode areanya sebelum Anda memahami sisa nomornya.
Anda mungkin juga ingin menangani
vanity
nomor seperti(800) Lucky-Guy
, yang memerlukan pengakuan bahwa, jika itu adalah nomor AS, ada satu digit terlalu banyak (dan Anda mungkin perlu representasi penuh untuk periklanan atau tujuan lain) dan bahwa di AS surat-surat itu dipetakan ke nomor berbeda dari di Jerman.Anda mungkin juga ingin menyimpan seluruh nomor secara terpisah sebagai bidang teks (dengan internasionalisasi) sehingga Anda dapat kembali lagi nanti dan mengurai ulang nomor saat ada perubahan, atau sebagai cadangan jika seseorang mengirimkan metode yang buruk untuk mengurai format negara tertentu dan kehilangan informasi.
sumber
KISS - Saya bosan dengan banyak situs web AS. Mereka memiliki beberapa kode yang ditulis dengan cerdik untuk memvalidasi kode pos dan nomor telepon. Ketika saya mengetikkan info kontak Norwegia saya yang benar-benar valid, saya menemukan bahwa cukup sering hal itu ditolak.
Biarkan sebagai string, kecuali Anda memiliki kebutuhan khusus untuk sesuatu yang lebih maju.
sumber
nvarchar(42)
dengan sedikit validasi/^+?[0-9 -\.\(\)#*]{4,41}$/
bekerja dengan sangat baik!The Wikipedia halaman di E.164 harus memberitahu Anda segala sesuatu yang perlu Anda ketahui.
sumber
Inilah struktur yang saya usulkan, saya menghargai umpan balik:
Bidang database telepon harus berupa varchar (42) dengan format berikut:
CountryCode - Nomor x Ekstensi
Jadi, misalnya, di AS, kami dapat memiliki:
1-2125551234x1234
Ini akan mewakili nomor AS (kode negara 1) dengan kode area / nomor (212) 555 1234 dan ekstensi 1234.
Memisahkan kode negara dengan tanda hubung membuat kode negara jelas bagi seseorang yang membaca dengan teliti data. Ini tidak sepenuhnya diperlukan karena kode negara adalah " kode awalan " (Anda dapat membacanya dari kiri ke kanan dan Anda selalu dapat menentukan negaranya dengan jelas). Namun, karena kode negara memiliki panjang yang berbeda-beda (antara 1 dan 4 karakter saat ini), Anda tidak dapat dengan mudah mengetahui kode negara secara sekilas kecuali Anda menggunakan semacam pemisah.
Saya menggunakan "x" untuk memisahkan ekstensi karena jika tidak maka tidak akan mungkin (dalam banyak kasus) untuk mencari tahu mana nomornya dan mana yang merupakan ekstensi.
Dengan cara ini Anda dapat menyimpan seluruh nomor, termasuk kode negara dan ekstensi, dalam satu bidang database, yang kemudian dapat Anda gunakan untuk mempercepat kueri Anda, daripada bergabung pada fungsi yang ditentukan pengguna seperti yang telah Anda lakukan dengan susah payah sejauh ini. .
Mengapa saya memilih varchar (42)? Pertama-tama, nomor telepon internasional akan memiliki panjang yang bervariasi, oleh karena itu disebut "var". Saya menyimpan tanda hubung dan "x", jadi itu menjelaskan "char", dan bagaimanapun, Anda tidak akan melakukan aritmatika integer pada nomor telepon (saya kira) jadi tidak masuk akal untuk mencoba menggunakan tipe numerik . Adapun panjang 42, saya menggunakan panjang maksimum yang mungkin dari semua bidang yang dijumlahkan, berdasarkan jawaban Adam Davis, dan menambahkan 2 untuk tanda hubung dan 'x ".
sumber
Cari E.164. Pada dasarnya, Anda menyimpan nomor telepon sebagai kode yang dimulai dengan awalan negara dan akhiran pbx opsional. Tampilan kemudian menjadi masalah lokalisasi. Validasi juga dapat dilakukan, tetapi juga merupakan masalah lokalisasi (berdasarkan awalan negara).
Misalnya, + 12125551212 + 202 akan diformat dalam lokal en_US sebagai (212) 555-1212 x202. Ini akan memiliki format yang berbeda dalam
en_GB
ataude_DE
.Ada cukup banyak info di luar sana tentang ITU-T E.164, tetapi cukup samar.
sumber
Saya pribadi menyukai gagasan untuk menyimpan nomor telepon varchar yang dinormalisasi (mis. 9991234567) kemudian, tentu saja, memformat nomor telepon itu sebaris saat Anda menampilkannya.
Dengan cara ini semua data dalam database Anda "bersih" dan bebas format
sumber
Penyimpanan
Simpan telepon di RFC 3966 (seperti
+1-202-555-0252
,+1-202-555-7166;ext=22
). Perbedaan utama dari E.164 adalahUntuk mengoptimalkan kinerja operasi tampilan, simpan telepon dalam format Nasional / Internasional di sebelah bidang RFC 3966.
Jangan simpan kode negara di bidang terpisah kecuali Anda memiliki alasan yang serius untuk itu. Mengapa? Karena Anda tidak boleh meminta kode negara di UI.
Kebanyakan, orang masuk ke telepon saat mereka mendengarnya. Misalnya jika format lokal akan dimulai dari
0
atau8
, akan mengganggu pengguna untuk melakukan transformasi nomor di kepala (seperti, " OK, jangan ketik '0', pilih negara dan ketikkan sisanya kata orang di bidang ini ").Parsing
Google mendukung Anda dan Anda dapat memvalidasi dan mengurai nomor telepon apa pun dengan menggunakan perpustakaan libphonenumber mereka . Ada port untuk hampir semua bahasa.
Jadi biarkan pengguna memasukkan "
0449053501
" atau "04 4905 3501
" atau "(04) 4905 3501
". Alat tersebut akan menentukan sisanya untuk Anda.Lihat demo resminya , untuk mengetahui seberapa besar manfaatnya.
sumber
Mungkin menyimpan bagian nomor telepon di kolom yang berbeda, memungkinkan entri kosong atau nol?
sumber
Ok, jadi berdasarkan info di halaman ini, berikut adalah awal dari validator nomor telepon internasional:
Berdasarkan skrip dari halaman ini: http://www.webcheatsheet.com/javascript/form_validation.php
sumber
Standar untuk memformat angka adalah e.164 , Anda harus selalu menyimpan angka dalam format ini. Anda tidak boleh mengizinkan nomor ekstensi di bidang yang sama dengan nomor telepon, itu harus disimpan secara terpisah. Adapun numerik vs alfanumerik, Itu tergantung pada apa yang akan Anda lakukan dengan data itu.
sumber
Saya pikir teks bebas (mungkin varchar (25)) adalah standar yang paling banyak digunakan. Ini akan memungkinkan untuk format apa pun, baik domestik atau internasional.
Saya kira faktor pendorong utama mungkin adalah bagaimana tepatnya Anda menanyakan angka-angka ini dan apa yang Anda lakukan dengannya.
sumber
Saya menemukan sebagian besar formulir web dengan benar mengizinkan kode negara, kode area, lalu 7 digit sisanya tetapi hampir selalu lupa untuk mengizinkan masuknya ekstensi. Ini hampir selalu berakhir dengan membuat saya mengucapkan kata-kata marah, karena di tempat kerja kami tidak memiliki resepsionis, dan ext. # Diperlukan untuk menghubungi saya.
sumber
Saya harus memeriksanya, tetapi menurut saya skema DB kami serupa. Kami memegang kode negara (mungkin default ke AS, tidak yakin), kode area, 7 digit, dan ekstensi.
sumber
Bagaimana dengan menyimpan kolom teks bebas yang menunjukkan versi nomor telepon yang mudah digunakan, lalu versi yang dinormalisasi yang menghilangkan spasi, tanda kurung, dan memperluas '+'. Sebagai contoh:
Ramah pengguna: +44 (0) 181 4642542
Dinormalisasi : 00441814642542
sumber
Saya akan memilih bidang teks bebas dan bidang yang berisi versi numerik murni dari nomor telepon. Saya akan menyerahkan representasi nomor telepon kepada pengguna dan menggunakan bidang yang dinormalisasi khusus untuk perbandingan nomor telepon dalam aplikasi berbasis TAPI atau ketika mencoba menemukan entri ganda dalam direktori telepon. Tentu tidak ada salahnya memberikan pengguna skema entri yang menambahkan intelijen seperti bidang terpisah untuk kode negara (jika perlu), kode area, nomor pangkalan dan ekstensi.
sumber
Dari mana Anda mendapatkan nomor telepon? Jika Anda mendapatkannya dari bagian jaringan telepon, Anda akan mendapatkan serangkaian digit dan jenis nomor serta paket, mis
441234567890 tipe / rencana 0x11 (yang berarti E.164 internasional)
Dalam kebanyakan kasus, hal terbaik yang harus dilakukan adalah menyimpan semua ini sebagaimana adanya, dan menormalkan tampilan, meskipun menyimpan nomor yang dinormalisasi dapat berguna jika Anda ingin menggunakannya sebagai kunci unik atau serupa.
sumber
(0) tidak valid dalam format internasional. Lihat standar ITU-T E.123.
Format "dinormalisasi" tidak akan berguna bagi pembaca AS karena mereka menggunakan 011 untuk akses internasional.
sumber
Saya telah menggunakan 3 cara berbeda untuk menyimpan nomor telepon tergantung pada persyaratan penggunaan.
sumber