Вопрос

Я хочу ввести номер телефона в форму, включая код страны, добавочный номер.

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

Теоретически это позволяет нам выполнять сравнительный поиск в поле «Номер», например получать все телефонные номера, которые начинаются с определенного кода города, не беспокоясь о том, как они были введены пользователями.

Обычно я храню номера телефонов как BIGINT в формате E164.

E164 никогда не начинается с 0, причем первые несколько цифр представляют собой код страны.

+441234567890
+44 (0)1234 567890
01234 567890

и т. д.будет храниться как 441234567890.

я бы использовал varchar для телефонных номеров.таким образом вы также можете хранить + и (), которые иногда можно увидеть в номерах телефонов (как вы сами упомянули).и вам не нужно беспокоиться об использовании всех битов целых чисел.

Я не уверен, стоит ли вообще использовать целые числа.Некоторые числа могут содержать специальные символы (например, # как часть расширения), которые вы тоже должны уметь обрабатывать.Поэтому я бы предложил вместо этого использовать varchars.

Если хранение менее 1 миллиона записей и высокая производительность не являются проблемой, используйте varchar(20)/char(20). В противном случае я обнаружил, что для хранения даже 100 миллионов деловых или личных телефонов по всему миру лучше всего подходит int.Причина :меньший ключ -> более высокая скорость чтения/записи, также форматирование может допускать дубликаты.

1 телефон в char(20) = 20 байт против 8 байт bigint (или 10 против 4 байт int для местных телефонов до 9 цифр) , в индексный блок может войти меньше записей => больше блоков => больше поисков, см. этот для получения дополнительной информации (написано для 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.При хранении Е164 телефоны, bigint — лучший вариант.

Рассмотрите возможность нормализации Е.164 формат.Для полной международной поддержки вам понадобится VARCHAR из 15 цифр.

Видеть Рекомендация Twilio дополнительную информацию о локализации телефонных номеров.

INT(10) не означает 10-значное число, оно означает целое число с шириной отображения 10 цифр.Максимальное значение для INT в MySQL — 2147483647 (или 4294967295, если оно беззнаковое).

Вы можете использовать BIGINT вместо INT, чтобы сохранить его в числовом виде.Использование Bigint сэкономит вам 3 байта на строку над Varchar (10).

Хранить «Страна+район+номер отдельно».Вы можете попробовать использовать VARCHAR(20), это позволит вам правильно хранить международные телефонные номера, если возникнет такая необходимость.

Я думаю, varchar или text должны быть лучшими типами данных для хранения номеров мобильных телефонов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top