database شرح - هل هناك معيار لتخزين أرقام الهواتف العادية في قاعدة بيانات؟




system types (15)

ما هي بنية البيانات الجيدة لتخزين أرقام الهواتف في حقول قاعدة البيانات؟ أنا أبحث عن شيء مرن بما فيه الكفاية للتعامل مع الأرقام الدولية ، وأيضا شيء يسمح باستجواب الأجزاء المختلفة من الرقم بكفاءة.

تعديل: فقط لتوضيح حالة الاستخدام هنا: أقوم حاليًا بتخزين الأرقام في حقل varchar واحد ، وأتركها تمامًا كما قام العميل بإدخالها. بعد ذلك ، عندما يكون الرقم مطلوبًا بواسطة الكود ، أقوم بتطبيعته. المشكلة هي أنه إذا كنت أرغب في الاستعلام عن بضعة ملايين من الصفوف للعثور على أرقام هواتف متطابقة ، فإنها تتضمن وظيفة ، مثل

where dbo.f_normalizenum(num1) = dbo.f_normalizenum(num2)

وهو غير فعال بشكل فظيع. كما أن الاستعلامات التي تبحث عن أشياء مثل رمز المنطقة تصبح صعبة للغاية عندما يكون حقل varchar واحد فقط.

[تصحيح]

قدم الناس الكثير من الاقتراحات الجيدة هنا ، شكرًا! كتحديث ، هنا ما أفعله الآن: ما زلت أقوم بتخزين الأرقام تمامًا كما تم إدخالها ، في حقل varchar ، ولكن بدلاً من تطبيع الأشياء في وقت الاستعلام ، لدي مشغل يعمل كل ما يتم إدخاله في السجلات أو تحديثها. لذلك ، لديّ أحبار أو أحجام كبيرة لأية أجزاء أحتاج إلى الاستعلام عنها ، ويتم فهرسة هذه الحقول لجعل الاستعلامات تعمل بشكل أسرع.


Answers

أنا شخصياً أحب فكرة تخزين رقم هاتف varchar عادي (على سبيل المثال 9991234567) ، ثم ، بالطبع ، تنسيق رقم الهاتف هذا أثناء عرضه.

بهذه الطريقة تكون كافة البيانات الموجودة في قاعدة البيانات "نظيفة" وخالية من التنسيق


ابحث عن E.164. بشكل أساسي ، تقوم بتخزين رقم الهاتف كرمز يبدأ ببادئة البلد ولاحقة pbx اختيارية. العرض هو ثم مسألة الترجمة. يمكن أيضًا إجراء عملية التحقق ، ولكنها أيضًا مشكلة متعلقة بالتطوين (استنادًا إلى بادئة البلد).

على سبيل المثال ، سيتم تنسيق + 12125551212 + 202 في اللغة en_US كـ (212) 555-1212 x202. سيكون له تنسيق مختلف في de_DE أو de_DE .

هناك قدر كبير من المعلومات حول ITU-T E.164 ، لكنه مشفر جدًا.


أعتقد أن النص الحر (ربما varchar (25)) هو المعيار الأكثر استخداماً. سيسمح هذا بأي تنسيق ، سواء محلي أو دولي.

أعتقد أن عامل القيادة الرئيسي قد يكون هو كيفية استفسارك بالضبط عن هذه الأرقام وما تفعله بها.


أجد معظم نماذج الويب تسمح بشكل صحيح لرمز البلد ، رمز المنطقة ، ثم الأرقام السبعة المتبقية ولكن في الغالب ننسى السماح بإدخال ملحق. ينتهي هذا الأمر دائمًا بجعلني أسمع كلمات غاضبة ، لأننا في العمل ليس لدينا موظف استقبال ، وهناك حاجة إلى رقم تحويلة الخاص بي للوصول إلي.

يجب أن أتحقق ، ولكن أعتقد أن مخطط قاعدة البيانات لدينا مشابه. نحن نحمل رمز البلد (قد يكون ذلك بشكل افتراضي إلى الولايات المتحدة ، غير متأكد) ، رمز المنطقة ، 7 أرقام ، والإضافة.


أجد معظم نماذج الويب تسمح بشكل صحيح لرمز البلد ، رمز المنطقة ، ثم الأرقام السبعة المتبقية ولكن في الغالب ننسى السماح بإدخال ملحق. ينتهي هذا الأمر دائمًا بجعلني أسمع كلمات غاضبة ، لأننا في العمل ليس لدينا موظف استقبال ، وهناك حاجة إلى رقم تحويلة الخاص بي للوصول إلي.


المستخدم ودية: +44 (0) 181 464 2542 تطبيع: 00441814642542

ال (0) غير صالح في الشكل الدولي. انظر معيار ITU-T E.123.

لن يكون التنسيق "الطبيعي" مفيدًا للقراء الأمريكيين عندما يستخدمون 011 للوصول الدولي.



إليك البنية المقترحة ، وسأكون ممتنًا

يجب أن يكون حقل قاعدة بيانات الهاتف varchar (42) بالتنسيق التالي:

كود البلد - عدد x ملحق

لذلك ، على سبيل المثال ، في الولايات المتحدة ، يمكننا الحصول على:

1-2125551234x1234

سيمثل هذا رقمًا أمريكيًا (رمز البلد 1) مع رمز / رقم المنطقة (212) 555 1234 والامتداد 1234.

يؤدي فصل رمز البلد باستخدام شرطة إلى جعل رمز البلد واضحًا لشخص يدعي البيانات. هذا ليس ضروريًا تمامًا لأن رموز البلدان هي " رموز البادئة " (يمكنك قراءتها من اليسار إلى اليمين وستتمكن دائمًا من تحديد البلد بشكل لا لبس فيه). ولكن نظرًا لأن رموز البلد لها أطوال مختلفة (تتراوح بين 1 و 4 أحرف في الوقت الحالي) ، فلا يمكنك بسهولة معرفة رمز البلد في لمحة ما لم تستخدم نوعًا من الفواصل.

يمكنني استخدام "x" لفصل الامتداد ، وإلا لن يكون ممكناً (في كثير من الحالات) معرفة الرقم واللاحقة.

وبهذه الطريقة ، يمكنك تخزين الرقم بالكامل ، بما في ذلك رمز البلد والإضافة ، في حقل قاعدة بيانات واحدة ، والذي يمكنك استخدامه بعد ذلك لتسريع الاستعلامات الخاصة بك ، بدلاً من الانضمام إلى وظيفة محددة من قبل المستخدم كما كنت تفعل بشكل مؤلم حتى الآن .

لماذا اخترت varchar (42)؟ حسنا ، أولا ، ستكون أرقام الهاتف الدولية ذات أطوال متنوعة ، وبالتالي فإن "فار". أنا أقوم بتخزين شرطة و "x" ، بحيث يشرح "char" ، وعلى أي حال ، لن تقوم بحساب صحيح على أرقام الهاتف (أعتقد) لذلك من المنطقي أن نحاول استخدام نوع عددي . أما بالنسبة لطول 42 ، فقد استخدمت أقصى طول ممكن لجميع الحقول المضافة ، بناءً على إجابة آدم ديفيس ، وأضفت 2 للاندفاع و "x".


كنت سأذهب إلى حقل freetext وحقل يحتوي على نسخة رقمية بحتة من رقم الهاتف. أود أن أترك تمثيل رقم الهاتف للمستخدم واستخدم الحقل المعتاد تحديدًا لإجراء المقارنات بين أرقام الهواتف في التطبيقات المستندة إلى TAPI أو عند محاولة البحث عن إدخالات مزدوجة في دليل الهاتف. بالطبع لا يؤذي تزويد المستخدم بمخطط دخول يضيف ذكاء مثل حقول منفصلة لرمز الدولة (عند الضرورة) ، رمز المنطقة ، رقم الأساس والإمتداد.


KISS - لقد سئمت الكثير من مواقع الويب الأمريكية. لديهم بعض الرموز المكتوبة ببراعة للتحقق من صحة الرموز البريدية وأرقام الهواتف. عندما أقوم بكتابة معلومات الاتصال النرويجية الصالحة تمامًا ، أجد أنه يتم رفضها كثيرًا.

اتركها سلسلة ، ما لم يكن لديك بعض الاحتياجات المحددة لشيء أكثر تقدمًا.


معيار تنسيق الأرقام هو e.164 ، يجب عليك دائمًا تخزين الأرقام بهذا التنسيق. يجب ألا تسمح مطلقًا برقم الإضافة في نفس الحقل مع رقم الهاتف ، يجب تخزينها على حدة. بالنسبة إلى الأرقام الرقمية مقابل الأبجدية الرقمية ، يعتمد الأمر على ما ستفعله باستخدام هذه البيانات.


لقد استخدمت 3 طرق مختلفة لتخزين أرقام الهواتف وفقًا لمتطلبات الاستخدام.

  1. إذا تم تخزين الرقم فقط لاستعادة الإنسان ولن يتم استخدامه للبحث في تخزينه في حقل نوع السلسلة تمامًا كما قام المستخدم بإدخاله.
  2. إذا كان سيتم البحث عن الحقل ، فستتم إزالة أي أحرف إضافية ، مثل + والمسافات والأقواس وغيرها ، وسيتم تخزين الرقم المتبقي في حقل نوع السلسلة.
  3. أخيرًا ، إذا كان رقم الهاتف سيتم استخدامه بواسطة تطبيق كمبيوتر / هاتف ، في هذه الحالة ، يجب إدخاله وتخزينه كرقم هاتف صالح يمكن استخدامه بواسطة النظام ، وهذا الخيار بالطبع هو أصعب شفرة إلى عن على.

من أين تحصل على أرقام الهواتف؟ إذا كنت تحصل عليها من جزء من شبكة الهاتف ، فسوف تحصل على سلسلة من الأرقام ونوع رقم وخطة ، على سبيل المثال

441234567890 نوع / خطة 0x11 (مما يعني الدولي E.164)

في معظم الحالات ، أفضل شيء للقيام به هو تخزين كل هذه الأشياء كما هي ، وتطبيعها للعرض ، على الرغم من أن تخزين الأرقام العادية يمكن أن يكون مفيدًا إذا كنت ترغب في استخدامها كمفتاح فريد أو ما شابه.


حسنًا ، بناءً على المعلومات الواردة في هذه الصفحة ، إليك بداية على مدقق رقم الهاتف الدولي:

function validatePhone(phoneNumber) {
    var valid = true;
    var stripped = phoneNumber.replace(/[\(\)\.\-\ \+\x]/g, '');    

    if(phoneNumber == ""){
        valid = false;
    }else if (isNaN(parseInt(stripped))) {
        valid = false;
    }else if (stripped.length > 40) {
        valid = false;
    }
    return valid;
}

يعتمد بشكل فضفاض على نص برمجي من هذه الصفحة: http://www.webcheatsheet.com/javascript/form_validation.php


.da لرؤية جميع قواعد البيانات - واحد يسمى " الرئيسي "

الجداول من قاعدة البيانات هذه يمكن أن ينظر إليها من قبل

حدد tbl_name مميزة من ترتيب sqlite_master بواسطة 1؛

تحتاج قواعد البيانات المرفقة إلى البادئات التي اخترتها مع AS في العبارة ATTACH على سبيل المثال aa (، bb، cc ...) لذلك:

حدد tbl_name مميزة من aa.sqlite_master ترتيب بواسطة 1؛

لاحظ أن هنا تحصل على وجهات النظر كذلك. لاستبعاد هذه الإضافة ، اكتب type = 'table' قبل 'order'







database