ISO 3166 — это семейство стандартов, которое даёт каждой стране и территории устойчивый код, а её регионам — код второго уровня. Для разработчика это означает простую вещь: страну в базе можно хранить не названием, а коротким идентификатором, который не зависит от языка, орфографии и раскладки клавиатуры. Ниже разберём, зачем одной стране сразу три разных кода, как устроены коды регионов и почему попытка изобрести собственный код почти всегда заканчивается расхождениями.
Зачем одной стране три разных кода
Причина в том, что у разных задач разные требования к компактности и устойчивости. Двухбуквенный код максимально короткий, поэтому именно его чаще всего используют при обмене данными и в интерфейсах: он экономит место в таблицах, легко читается человеком и почти всегда однозначен.
Трёхбуквенный код длиннее, но заметно реже даёт совпадения и лучше переносится человеком, который набирает его вручную. Там, где цена ошибки выше, а размер записи не так важен, он удобнее.
Третий вариант — числовой. Его главное достоинство в том, что он не зависит от письменности: цифры одинаково выглядят в любой стране и не требуют правильной раскладки. Кроме того, к опечаткам в написании букв такой код нечувствителен вовсе, потому что букв в нём нет.
Ключевое, что нужно помнить: все три формы описывают одну и ту же страну. Это не разные сущности, а три написания одного значения, и смешивать их в одной системе нельзя.
Что происходит при смешивании кодов
Представим типичную ситуацию: справочник стран в одной системе заполнен двухбуквенными кодами, а аналитическая таблица приходит с трёхбуквенными. Соединить их напрямую не получится — значения не совпадут ни в одной строке, хотя обе таблицы описывают одни и те же страны.
Хуже, когда смешивание происходит незаметно. Если поле принимает значение любой длины, в нём со временем оказываются оба формата, а часть записей — ещё и названия стран, введённые человеком. После этого любая группировка по стране даёт несколько групп там, где должна быть одна.
Вывод практический: выберите один формат как основной для хранения и приводите к нему всё, что приходит извне. Переводить между формами можно и нужно, но делать это следует в одном месте — на границе системы.
Как устроены коды регионов
Второй уровень стандарта описывает административные единицы внутри страны. Код строится из кода страны, разделителя и местного обозначения региона, поэтому он читается сразу: по префиксу видно, о какой стране речь, а по второй части — о каком регионе.
Именно из-за такого устройства регионы разных стран не путаются между собой, даже если их местные обозначения совпадают. Это удобно для хранения, но требует аккуратности при выводе: пользователю нужен понятный текст, а не строка из кода и разделителя.
Отдельно стоит понимать, что этот стандарт — не единственный список регионов в мире. Свои перечни ведут статистические службы, почтовые операторы и налоговые органы, и их коды с описанными выше не совпадают. Совпадение возможно, но это случайность, а не правило.
| Что за код | Кто ведёт | Для чего обычно служит |
|---|---|---|
| Код страны | международный стандарт | идентификация страны при обмене данными |
| Код региона по стандарту | тот же стандарт | идентификация области, штата, префектуры |
| Местный код региона | ведомство страны | отчётность, налоги, почтовая сортировка |
Можно ли добавить свой код для новой страны?
Нет, и это важнее, чем кажется. Код работает только тогда, когда его одинаково понимают обе стороны обмена. Как только одна система вводит собственное обозначение, автоматическое сопоставление с внешним миром ломается: чужой справочник о новом коде не знает, а ваш — не знает о существующих.
На практике собственные коды появляются там, где нужно обозначить то, чего в стандарте нет: внутренние тестовые записи, временные образования, особые случаи учёта. Если без этого не обойтись, такие значения стоит держать отдельно от стандартных и явно помечать, чтобы они никогда не утекли в обмен с внешними системами.
Для тестовых данных это особенно важно: выдуманный код легко принять за настоящий, и через месяц уже никто не вспомнит, откуда он взялся и что означал.
Что делать с устаревшими и неизвестными кодами?
Мир меняется: появляются новые государства и территории, меняются названия, какие-то коды перестают действовать. Поэтому список стран — не константа, а то, что время от времени обновляется.
Отсюда требование к дизайну: поле должно уметь хранить неизвестное системе значение. Если код не найден в справочнике, правильная реакция — сохранить его как есть и показать нейтральную пометку, а не заменять пустым значением и не отбрасывать запись целиком. Иначе обновление справочника на одной стороне приведёт к потере данных на другой.
То же касается связки с регионами: если устарел код страны, код региона почти наверняка тоже требует пересмотра, и проверять их стоит вместе.
Как это выглядит в нашем генераторе
Генератор фальшивых адресов выбирает страну из фиксированного списка, поэтому код страны и код региона внутри адреса всегда согласованы: регион принадлежит выбранной стране, а не взят из чужой строки справочника. Посмотреть, как это выглядит для конкретной страны, можно на примере США.
Сгенерированные адреса синтезированы алгоритмом и не соответствуют реальным домам или получателям. Они годятся только для тестирования программ: по ним нельзя ничего отправить, и они не подтверждают место жительства.
Ещё одно решение, которое стоит принять заранее: как хранить код. Короткая строка фиксированной длины удобнее числа: она не теряет ведущие нули, не зависит от разрядности и одинаково выглядит при выгрузке. Проверять значение лучше по таблице, а не по шаблону, потому что шаблон пропускает сочетания, которых в перечне нет, и отвергает те, что в нём есть.
И ещё: если код приходит из внешней системы, не пытайтесь исправить его на лету. Приведение к верхнему регистру и удаление лишних пробелов — нормальная нормализация, а вот попытка угадать, что имел в виду отправитель, почти всегда заканчивается неверной записью.
Что важно разработчику
Первое: выберите один код как основной для хранения и задокументируйте этот выбор. Смешение форматов в одном поле — источник ошибок, которые обнаруживаются поздно.
Второе: не считайте справочник стран неизменным. Храните признак версии или даты обновления и исходите из того, что рано или поздно придёт значение, которого в вашей копии нет.
Третье: не выводите коды пользователю. Человеку нужны названия и понятные подписи; код — служебное значение, и жить оно должно в данных, а не в интерфейсе.
Четвёртое: проверяйте пары «страна и регион» вместе. Как это связано с проверкой адреса целиком, разобрано в статье про проверку и нормализацию, а как выглядит порядок полей — в материале о формате международного адреса.
Что делать дальше
Если вы составляете справочник для формы, возьмите официальный перечень стран в одном формате и добавьте к нему отдельный список регионов, сгруппированный по странам. Проверить, как ведёт себя форма на данных из разных стран, удобно в генераторе: он выдаёт адрес вместе с согласованными полями региона и страны, и такую запись можно сразу положить в тестовый набор.