Як зберігати телефонні номери в PostgreSQL?


16

Припустимо, я хочу зберігати телефонні номери в базі даних. Я можу приймати номери телефонів з-за меж США. Як би я міг зберігати ці номери телефонів?


Відповіді:


22

libphonenumber

По можливості завжди використовуйте канонічну форму. Чим більше нормалізована форма, тим краще. Якщо є стандарт, використовуйте його. Для цієї проблеми скористаємося libphonenumber від Google за допомогою проксі-сервера 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 ++. Я просто захоплююсь тим, що в PgSQL прив'язується libphonenumber та інші, хто знає про них та як ними користуватися.
Еван Керролл

5
Внесок у документацію сприяє. ;) І я буду використовувати libphonenumber у (безпечному, не критичному) моєму проекті через цю посаду. Дякую.
Даріо

4
Наскільки це варте, ми використовуємо libphonenumber для нормалізації кількості до того, як він потрапить у базу даних - таким чином нам не потрібно залежати від (під час написання) плагінів пост-грецької якості, які не можна використовувати в RDS та інші розгортання на основі хмарних повідомлень.
Джон Хамелінк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.