Jak przechowywać numery telefonów w PostgreSQL?

Odpowiedzi:

22

libphonenumber

Jeśli to możliwe, zawsze używaj formy kanonicznej. Im bardziej znormalizowana forma, tym lepiej. Jeśli istnieje standard, użyj go. W przypadku tego problemu użyjmy numeru libphonen Google'a przez proxy pg-libphonenumber .

CREATE EXTENSION pg_libphonenumber;

Obecnie instaluje phone_numbertyp, który ma operatory porównania i funkcje. Przechowuje numer w międzynarodowej kanonicznej formie. To moim zdaniem najlepszy kompromis.

parse_phone_number('textnumber', 'CountryCode');

Ponieważ wiemy, kiedy numery telefonów są sobie równe, i udostępniamy wewnętrzny normalny formularz, możemy to zrobić ...

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

(zwraca true). Oznacza to również, że DISTINCTdziała, więc możemy to zrobić, aby uzyskać efekt, który wydaje się, że chcesz powyżej.

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

To powoduje…

 parse_phone_number 
--------------------
 +61 3 7010 1234
(1 row)
Evan Carroll
źródło
8
Niestety, paczka wydaje się być w stanie alfa przez ponad 1 rok ... Zalecana jest duża ostrożność, jeśli spróbujesz użyć jej w produkcji.
joanolo
2
@joanolo Masz rację, ale wygląda na to, że nowy współpracownik, Evan Carroll, dokonał dziś nowego zatwierdzenia ... Ktoś rozważyłby całą tę autopromocję ze strony Evana, ale głosowałem za odpowiedzią również dlatego, że aktywnie przyczyniając się do rozszerzenia ...
Dario
3
„Przyczyniłem się” tylko do dokumentacji. I zrobiłem to, zanim opublikowałem to w ten sam sposób, co zawsze robię, aby poprawić dokumentację. W żadnym użytecznym sensie nie jestem „współpracownikiem”. Nie mam bitu zatwierdzenia. Nie piszę kodu C ++. Jestem po prostu pasjonatem wiązania libphonenumber w PgSQL i innych, którzy wiedzą o nich i jak z nich korzystać.
Evan Carroll,
5
Wkład w dokumentację wnosi swój wkład. ;) I użyję libphonenumber w moim (bezpiecznym, niekrytycznym) projekcie z powodu tego postu. Dziękuję Ci.
Dario
4
Za ile jest to warte, używamy libphonenumber do normalizacji liczby, zanim trafi ona do bazy danych - w ten sposób nie musimy być zależni od (w chwili pisania) wtyczek postgres jakości alfa, których nie można używać w RDS oraz inne wdrożenia postgres w chmurze.
John Hamelink