Меню

Телефонный префикс и город: почему они не всегда совпадают

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

Опубликовано

  • тестовые данные
  • телефон

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

Из чего состоит международный номер

Международная запись номера начинается с кода страны. Его длина не фиксирована: он может занимать одну, две или три цифры, поэтому по началу строки нельзя однозначно сказать, где заканчивается код страны и начинается остальная часть.

Дальше идёт национальный номер. Его длина определяется правилами самой страны, и общего значения, одинакового для всех, не существует — есть лишь техническое ограничение на общую длину записи.

Единого способа расставить разделители тоже нет. Одна страна группирует цифры по три, другая — по два и три, третья не разделяет вовсе. Для хранения это означает простую вещь: разделители относятся к оформлению, а не к данным, и в базе номер логичнее держать одной последовательностью цифр вместе с кодом страны.

Отдельная тонкость — как записывать номер в базе. Разделители, скобки и пробелы удобны для чтения, но мешают сравнению: один и тот же номер, записанный двумя способами, превращается в два разных значения. Хранение в виде последовательности цифр вместе с кодом страны, а разделители только при выводе, снимает целый класс ошибок поиска и сопоставления записей.

Что означает код города?

Внутри национального номера часто есть часть, исторически закреплённая за местностью. Именно её в быту называют кодом города, и именно из неё пытаются вывести город абонента.

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

Первая: номера переносятся между операторами. Человек меняет оператора, сохраняя номер, и вместе с ним переходит в другую сеть, а иногда и в другой регион.

Вторая: у мобильных номеров привязка к местности изначально условная. Диапазон выделяется оператору, а не городу, и человек с таким номером может находиться где угодно.

Может ли префикс указать, где находится абонент?

Нет, и на это есть несколько независимых причин. Даже если код когда-то был закреплён за местностью, он говорит о происхождении диапазона, а не о текущем положении человека.

К этому добавляется то, что номер вообще не связан с адресом. Адрес регистрации, адрес доставки и место, откуда звонят, — три разные вещи, которые совпадают далеко не всегда.

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

Надёжность разных выводов удобно сравнить в таблице.

Что сравниваем Насколько надёжен вывод
Код страны и адрес надёжно: номер принадлежит этой стране
Длина номера и правила страны надёжно в пределах известных правил
Код города и город в адресе ненадёжно: номер мог переехать вместе с человеком
Диапазон и оператор устаревает быстро и незаметно

Из таблицы видно, где проверка уместна, а где она лишь создаёт видимость контроля.

Как проверять согласованность в тестовых данных

В тестовых наборах связка «номер и город» полезна не как правило, а как проверка самой системы. Если данные собираются автоматически, стоит убедиться, что номер не остался от другого адреса — например, при копировании записи.

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

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

Чем мобильный номер отличается от городского

Разница между городским и мобильным номером глубже, чем кажется: именно она объясняет, откуда вообще взялась идея о связи номера с городом.

Городской номер исторически был привязан к месту: линия физически приходила в конкретный дом, поэтому часть номера обозначала район, а иногда и более мелкую зону внутри него. Пока эта связь была физической, вывод о городе работал.

Мобильные номера устроены иначе. Диапазоны выделяются операторам, а оператор обслуживает всю страну, поэтому привязка к городу у мобильного номера изначально условна. Даже если когда-то она совпадала с местом выдачи, сегодня ничто не мешает человеку пользоваться номером в другом регионе.

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

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

Ни один из этих случаев не мешает использовать номер как контакт: он остаётся уникальным и рабочим. Меняется только одно — из него нельзя вывести, где человек находится, а значит, его нельзя использовать как доказательство в проверках.

Что важно разработчику

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

Второе: решите, чем является проверка согласованности. Если это предупреждение, его нужно уметь отключить или проигнорировать; если жёсткое правило, оно рано или поздно отклонит корректный номер.

Третье: не выводите из номера факты о человеке. Город по коду, оператор по диапазону, регион по префиксу — всё это догадки разной степени надёжности, и в интерфейсе они не должны выглядеть как данные.

Четвёртое: помните, что номер живёт в форме рядом с адресом, поэтому проверять их стоит вместе. Как выглядит такая форма на данных разных стран, видно на примере США, а общий разбор полей — в материале о проверке и нормализации.

Место для такой проверки — отчёт о качестве данных, а не путь оформления заказа. Если система замечает, что номер и город не совпадают, полезно записать это в журнал или показать в отчёте, но не мешать человеку завершить действие. Иначе получается правило, которое нельзя ни доказать, ни отключить.

Если номер всё же нужно сопоставлять с адресом, лучше делать это один раз при вводе и сохранять результат отдельно, чем пересчитывать при каждом чтении. Пересчёт по актуальным справочникам через год даст другой ответ, и одна и та же запись начнёт выглядеть по-разному в зависимости от даты отчёта. Для такой догадки стабильность важнее точности, которой у неё всё равно нет. Полезно и подписывать результат: не «город клиента», а «город, определённый по номеру», — тогда к значению будут относиться соответственно.

И о происхождении данных: номера и адреса из генератора вымышлены. Они предназначены только для тестирования программ, по ним нельзя ничего отправить, и они не подтверждают ни личность, ни место жительства.

Что делать дальше

Возьмите номер из генератора и подставьте его в форму вместе с адресом из другой страны: посмотрите, что именно скажет система — предупреждение или отказ. Если отказ, проверку стоит ослабить: связь между номером и городом слишком слаба, чтобы на ней что-то запрещать.

Читать дальше

Статьи: Генератор фальшивых адресов