Задать вопрос
@kofon
Я человек

Как лучше сохранять в базу данных номера телефонов?

Форматы номеров могут быть разные, 6, 7, 11 цифр.
Как именно
123-45-67 или 1234567
+7 (912)-345-67-89 --- +7 или 8?

(Во втором случае, я догадываюсь, что можно использовать код страны, из отдельной таблицы)
varchar тяжелее int
  • Вопрос задан
  • 60269 просмотров
Подписаться 8 Оценить Комментировать
Решения вопроса 1
@Oraclist
ИМХО, правильный ответ - как требуется потребителям (другим системам).
Можно сделать несколько полей:
1 - эталонный формат номера varchar2(20 char). Например, 79898112211
2 - преобразованный формат номера. Например, +7 (989) 811-22-11.
При добавлении выдавать пользователю вопрос, хотите стандартно или нестандартно + варианты нестандартных написаний и т.д.
Эталонный формат хранить обязательно. Как ключ. И хранить преобразованный, чтобы не выполнять каждый раз преобразование при обращении.
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
ivan_zhuck
@ivan_zhuck
В базе лучше всего хранить номера в международном формате, в виде 7XXXXXXXXXX (только цифры) в типе Decimal (если используется mysql). При таком подходе вы сможете сделать вывод номеров в любом месте вашего приложения в едином формате, а так же обеспечить корректный поиск и фильтрацию по номерам.
Ответ написан
Можно сохранять номер ввиде числа, а при выборке форматировать его на стороне приложения.
Ответ написан
Комментировать
berezuev
@berezuev
#define TRUE FALSE
varchar с разделением на код города (оператора) и сам номер
Ответ написан
Комментировать
@kofon Автор вопроса
Я человек
Как насчёт разделителей, лучше их просто удалять?
из 8 (912) 12
будет 891212

Просто тогда мы лишаемся одной вещи.
Может пользователь хочет чтобы его номер видели как:
89-89-11-222-11

Господа, как вы все на это смотрите?
Ответ написан
@ra2003
Если телефон дается пользователю, то лучше так +7 (916) 918-24-86, если в эксел, то лучше так перед "+7" что нибудь добавлять, например "t" или "_". Выглядит так _+7 (916) 918-24-86 или так t+7 (916) 918-24-86
Для нормализации удобнее хранить в 10 значном виде 9169182486 (если база ТОЛЬКО по телефонам России и/или Казахстана). По другим странам нужно смотреть какие могут быть варианты и анализировать.
Чуть сложнее бывает убрать двойников из базы (одновременно в ячейке "телефоны" у одной компании: 916918-2486 и 8 (916) 918-24-86) или "битые" телефоны (когда телефон должен быть 10-7-6 значный в данной стране-городе, а он, например 4-5 значный. С этим лучше бороться программно, например с помощью Питона.
Ответ написан
Комментировать
@d-stream
Готовые решения - не подаю, но...
В принципе самый лучший, слегка идеализированный вариант - разделять код страны, код зоны и собственно сам номер телефона. Ну и на уровне стран и зон стран хранить маски.

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

То есть для РФ +7 (900) 100-00-00 , +7 (8765) 22-99-99, + 7 (876-55) 5-25-25, а эти же номера для немца окажутся 007 900 1000000, 007 876 5229999, 007 876 5552525,

а для усть-урюпинска - могут быть как:

8 900 100-00-00, 8-2 22-99-99 и 5-25-25

хотя в базе - это будет 3+ поля

в принципе хранить имеет смысл как int, а для "хитростей" поиска по частичным маскам - просто держать вычисляемые поля, где номер кастится к [n]varchar
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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