Как хранить телефонные номера в PostgreSQL?

16

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

Эван Кэрролл
источник
1
en.wikipedia.org/wiki/E.164 является стандартом
Нил Макгиган

Ответы:

21

libphonenumber

По возможности всегда используйте каноническую форму. Чем больше нормализуется форма, тем лучше. Если есть стандарт, используйте его. Для этой проблемы давайте использовать Google libphonenumber по доверенности pg-libphonenumber .

CREATE EXTENSION pg_libphonenumber;

Это в настоящее время устанавливает phone_numberтип, который имеет операторы сравнения и функции. Он хранит номер в международной канонической форме. Это лучший компромисс на мой взгляд.

parse_phone_number('textnumber', 'CountryCode');

Поскольку мы можем сказать, когда номера телефонов совпадают друг с другом, и мы предоставляем внутреннюю нормальную форму, мы можем сделать это ..

SELECT parse_phone_number('03 7010 1234', 'AU') = parse_phone_number('(03) 7010 1234', 'AU');

(возвращает истину). Это также означает, что это DISTINCTработает, поэтому мы можем сделать это, чтобы получить эффект, который вы, кажется, хотите выше.

CREATE TABLE foo
AS
  SELECT DISTINCT parse_phone_number(ph, 'AU')
  FROM ( VALUES
    ('0370101234'),
    ('03 7010 1234'),
    ('(03) 7010 1234')
  ) AS t(ph);
SELECT 1

Это ставит в ..

 parse_phone_number 
--------------------
 +61 3 7010 1234
(1 row)
Эван Кэрролл
источник
8
К сожалению, пакет находится в альфа- состоянии более 1 года ... Рекомендуется очень осторожно, если вы пытаетесь использовать его в производстве.
Joanolo
2
@joanolo Вы правы, но, похоже, новый участник, Эван Кэрролл, только сегодня сделал новый коммит ... Кто-то мог бы подумать обо всем этом саморекламе со стороны Эвана, но я поддержал этот самоответ еще и потому, что он активно способствуя продлению ...
Дарио
3
Я только «внес вклад» в документацию. И я сделал это до того, как опубликовал это тем же способом, который я всегда делаю для улучшения документации. Я не "вкладчик", в любом полезном смысле. У меня нет коммитов. Я не пишу код на C ++. Я просто увлечен привязкой libphonenumber в PgSQL, и другие знают о них и как их использовать.
Эван Кэрролл
5
Вклад в документацию способствует. ;) И я буду использовать libphonenumber в моем (безопасном, некритическом) проекте из-за этого поста. Спасибо.
Дарио
4
Для чего бы это ни стоило, мы используем libphonenumber для нормализации числа перед его поступлением в базу данных - таким образом, нам не нужно зависеть от (на момент написания) плагинов альфа-качества postgres, которые нельзя использовать в RDS и другие облачные развертывания postgres.
Джон