Mysql datatype для номера телефона и адреса

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

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. Что лучше для обработки?

Спасибо за ваш совет.

Ответ 1

Ну, лично я не использую числовой тип данных для хранения телефонных номеров или связанной информации.

Как вы храните номер, скажем 001234567? Это закончится как 1234567, потеряв ведущие нули.

Конечно, вы всегда можете оставить его, но при условии, что вы точно знаете, сколько цифр должно быть.

Это не ответит на весь ваш пост,
Только мои 2 цента

Ответ 2

На самом деле вы можете использовать varchar для номера телефона. Вам не нужен int, потому что вы не собираетесь выполнять арифметику по номерам.

Ответ 3

Просто добавьте 2p опыта реального мира.

Мы сохраняем 2 поля для телефонных номеров - "число" и "маску". Оба они хранятся в виде типов TinyText

Прежде чем мы храним файлы, мы проанализируем номер телефона, чтобы получить форматирование, которое было использовано и которое создает маску, затем мы сохраняем число цифр только, например.

Вход: (0123) 456 7890
Номер: 01234567890
Маска: (nnnn)_nnn_nnnn

Теоретически это позволяет нам выполнять сравнения в поле "Число", например, получать все номера телефонов, начинающиеся с определенного кода области, без необходимости беспокоиться о том, как они были введены пользователями

Ответ 4

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

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

+441234567890
+44 (0)1234 567890
01234 567890

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

1 телефон в char (20) = 20 байт по сравнению с 8 байтами bigint (или 10 vs 4 байта int для локальных телефонов, до 9 цифр), меньше записей можно ввести индексный блок = > больше blocks = > больше запросов, см. this для получения дополнительной информации (writen для 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 Hash Codes. Если вы храните E164, лучше всего выбрать bigint.

Ответ 8

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

Подробнее о локализации телефонных номеров см. рекомендацию Twilio.

Ответ 9

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

Вы можете использовать BIGINT вместо INT, чтобы сохранить его как числовое. С помощью BIGINT сохранит вам 3 байта в строке над VARCHAR (10).

Чтобы сохранить "Страна + область + номер отдельно". Вы можете попробовать использовать VARCHAR (20), это позволит вам правильно хранить международные телефонные номера, если это необходимо.

Ответ 10

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