سؤال

أريد إدخال رقم الهاتف في شكل، بما في ذلك رمز البلد، التمديد

create table if not exists employee(    `   
      country_code_tel   int(11),
      tel_number         int(10),
      extension          int(10),
      mobile             bigint(20)
);

إذا كان Tel_Number أكبر من 15 بت، فما الذي يمكنني استخدامه، فستستخدم أفضل Bigint(20)?

create table address(
      address           varchar(255),  
      city              varchar(255),
      country           varchar(255),
      post_code         int(11)
);

على سبيل المثال، إذا كان لدي رمز قطري لكندا يمكنني استخدام +2 أو 002. ما هو أفضل للمعالجة؟

شكرا لنصيحتك.

هل كانت مفيدة؟

المحلول

حسنا، أنا شخصيا لا أستخدم نوع البيانات الرقمي لتخزين أرقام الهواتف أو المعلومات ذات الصلة.

كيف يمكنك تخزين عدد يقول 001234567؟ سوف ينتهي الأمر إلى 1234567، وفقدان الأصفار الرائدة.

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

هذا لا يجيب على مشاركتك بالكامل،
فقط 2 سنتات

نصائح أخرى

في الواقع يمكنك استخدام varchar لرقم الهاتف. لا تحتاج إلى INT لأنك لن تقوم بأداء حسابي على الأرقام.

تخزينها كحقلين لأرقام الهواتف - "عدد" و "قناع" كما TinyText أنواع التي لا تحتاج أكثر من 255 عناصر.

قبل تخزين الملفات التي نقوم بتحليل رقم الهاتف للحصول على التنسيق الذي تم استخدامه وهذا يخلق القناع، ثم نقوم بتخزين الرقم أرقام فقط

إدخال: (0123) 456 7890
رقم: 01234567890
قناع: (nnnn)_nnn_nnnn

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

أنا عادة تخزين أرقام الهواتف كغير تنسيق في تنسيق E164.

لا يبدأ E164 أبدا ب 0، مع الأرقام القليلة الأولى هي رمز البلد.

+441234567890
+44 (0)1234 567890
01234 567890

سيتم تخزينها كما 441234567890.

أود استخدام أرقام الهاتف. بهذه الطريقة يمكنك أيضا تخزين + و ()، والتي يتم رؤيتها في بعض الأحيان في أرقام الهاتف (كما ذكرت نفسك). وعدم داعي القلق بشأن استخدام جميع البتات في الأعداد الصحيحة.

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

إذا تم تخزين سجلات أقل من 1 ميل واحد، وعلى الأداء العالي ليس مشكلة تذهب ل varchar (20) / char (20) وإلا فقد وجدت أنه لتخزين أكثر من 100 ميليو عالم الأعمال التجارية أو الهواتف الشخصية، INT الأفضل. السبب: مفتاح أصغر -> أعلى سرعة القراءة / الكتابة، أيضا التنسيق يمكن السماح بالتكرارات.

1 هاتف في شار (20) = 20 بايت مقابل 8 بايت bigint (أو 10 مقابل 4 بايت int بالنسبة للهواتف المحلية، ما يصل إلى 9 أرقام)، يمكن إدخال الإدخالات الأقل إدخال كتلة الفهرس => المزيد من الكتل => المزيد من عمليات البحث، انظر هذه لمزيد من المعلومات (Writen for MySQL ولكن يجب أن يكون صحيحا بالنسبة لقواعد البيانات العلائقية الأخرى).

هنا مثال على طاولات الهاتف:

CREATE TABLE `phoneNrs` (   
    `internationalTelNr` bigint(20) unsigned NOT NULL COMMENT 'full number, no leading 00 or +, up to 19 digits, E164 format',
    `format` varchar(40) NOT NULL COMMENT 'ex: (+NN) NNN NNN NNN, optional',
    PRIMARY KEY (`internationalTelNr`)
    )
DEFAULT CHARSET=ascii
DEFAULT COLLATE=ascii_bin

أو مع معالجة / تقسيم قبل إدراج (2 + 2 + 4 + 1 = 9 بايت)

CREATE TABLE `phoneNrs` (   
    `countryPrefix` SMALLINT unsigned NOT NULL COMMENT 'countryCode with no leading 00 or +, up to 4 digits',
    `countyPrefix` SMALLINT unsigned NOT NULL COMMENT 'countyCode with no leading 0, could be missing for short number format, up to 4 digits',
    `localTelNr` int unsigned NOT NULL COMMENT 'local number, up to 9 digits',
    `localLeadingZeros` tinyint unsigned NOT NULL COMMENT 'used to reconstruct leading 0, IF(localLeadingZeros>0;LPAD(localTelNr,localLeadingZeros+LENGTH(localTelNr),'0');localTelNr)',
    PRIMARY KEY (`countryPrefix`,`countyPrefix`,`localLeadingZeros`,`localTelNr`)  -- ordered for fast inserts
) 
DEFAULT CHARSET=ascii
DEFAULT COLLATE=ascii_bin
;

أيضا "رقم الهاتف ليس رقما"، في رأيي أمر بالنسبة لنوع أرقام الهواتف. إذا كنا نتحدث عن دليل هاتف محمول داخلي، فستكون السلاسل على ما يرام، حيث قد يرغب المستخدم في تخزينه رموز تجزئة GSM. وبعد إذا تخزينها E164. الهواتف، bigint هي الخيار الأفضل.

النظر في تطبيع ل E.164. صيغة. للحصول على الدعم الدولي الكامل، كنت بحاجة إلى varchar من 15 رقما.

يرى توصية تيليو لمزيد من المعلومات حول توطين أرقام الهواتف.

لا يعني INT (10) رقما مكونا من 10 أرقام، فهذا يعني عددا صحيحا لعرض عرض 10 أرقام. القيمة القصوى ل int in MySQL هي 2147483647 (أو 4294967295 إذا غير موقعة).

يمكنك استخدام Bigint بدلا من int لتخزينها كرقم. سيوفر لك استخدام Bigint لك 3 بايت لكل صف عبر Varchar (10).

لتخزين "البلد + منطقة + رقم منفصل". يمكنك محاولة استخدام varchar (20)، وهذا يتيح لك القدرة على تخزين أرقام الهواتف الدولية بشكل صحيح، في حالة حاجة إلى تنشأ.

يجب أن يكون Varchar أو Text أفضل أنواع البيانات لتخزين أرقام الجوال التي أعتقدها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top