Как лучше хранить телефонный номер в БД?

Приветствую, друзья. Подскажите, как лучше хранить номер телефона в БД: в виде строки или в виде числа? Второй вариант выигрывает в весе, но следует учесть, что очень часто придется делать выборку номеров по определенным условиям. К примеру:

79[4-8][2-3]*

Нужно найти номера по такому шаблону (Начинаются на 79, дальше цифра от 4 до 8, дальше цифра от 2 до 3, остальные цифры могут быть любыми).

Что-бы такое провернуть с цифрами, шаблон можно парсить и превращать его в условия типа больше-меньше. Со строками ситуация выглядит проще, взять хотя бы тот же LIKE, который сам может обработать "звездочку" в шаблоне (конечно, если ее предварительно заменить на %).

А может есть какой-нибудь альтернативный вариант? Хранить какие-нибудь предподготовленные данные о номере, которые помогут сделать выборки быстрее?
  • Вопрос задан
  • 6793 просмотра
Решения вопроса 2
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
"Обожаю" такие вопросы.
Начнем с того - сколько у Вас номеров в базе, что Вам актуальна экономия места?
По теме - строки.
Ответ написан
@maxloyko
Только строки.
Попробуйте вставить номер телефона 001235489 в поле INT.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vnpp
Если следовать рекомендация по связи (см. Телефонные коды стран, Телефонный план нумерации), целесообразно хранить полный номер (+добавочный). Полный номер состоит из кода зоны и внутренних номеров, итоговая длина 11 цифр, для отдельной страны (локализованных систем) код зоны от 1 до 3 цифр хранить смысла нет. Итого, под полный номер подходит int8, под локальные может и int4 подходить.
Для добавочных номеров - отдельное поле, тут кто во что горазд.
Номера начинающиеся с нолей, как правило, местные (открытый план нумерации), хранить их нет смысла, т.к. позвонить по ним возможно только находясь в том же регионе.
Корректнее хранить полный номер и, при необходимости, отдельно, правила преобразования полного номера в местные и обязательно ограничения где это работает.
Хранение в int позволяет на уровне БД исключить ошибки ввода без использования regexp на каждый insert/update, более удобно хранить непрерывные диапазоны.
Однако, если не хранить "весь мир", слабо ощутимая выгода от перехода со string на int при хранении справочника номеров.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы