¿Cómo almaceno números de teléfono en PostgreSQL?

Respuestas:

21

libphonenumber

Cuando sea posible, use siempre la forma canónica. Cuanto más normalizada sea la forma, mejor. Si hay un estándar, úselo. Para este problema, usemos el número de libphonen de Google , por proxy de pg-libphonenumber .

CREATE EXTENSION pg_libphonenumber;

Esto instala actualmente el phone_numbertipo que tiene operadores y funciones de comparación. Almacena el número en forma canónica internacional. Este es el mejor compromiso en mi opinión.

parse_phone_number('textnumber', 'CountryCode');

Como podemos saber cuándo los números de teléfono son iguales y proporcionamos una forma normal interna, podemos hacer esto.

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

(devuelve verdadero). Esto también significa que DISTINCTfunciona para que podamos hacer esto para obtener el efecto que parece querer más arriba.

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

Eso pone en ..

 parse_phone_number 
--------------------
 +61 3 7010 1234
(1 row)
Evan Carroll
fuente
8
Desafortunadamente, el paquete parece estar en estado alfa durante más de 1 año ... Se recomienda un alto cuidado si intenta usarlo en producción.
joanolo
2
@joanolo Tienes razón, pero parece que un nuevo contribuyente, Evan Carroll, ha hecho un nuevo compromiso el día de hoy ... Alguien consideraría toda esta autopromoción por parte de Evan, pero también voté por esta respuesta porque está activamente contribuyendo a la extensión ...
Dario
3
Solo "contribuí" a la documentación. Y lo hice antes de publicar esto de la misma manera que siempre hago para mejorar la documentación. No soy un "contribuidor", en ningún sentido útil. No tengo un poco de compromiso. No escribo código C ++. Me apasiona tener un enlace de número de libphonen en PgSQL y que otros sepan sobre ellos y cómo usarlos.
Evan Carroll
55
Contribuir a la documentación es contribuir. ;) Y usaré libphonenumber en un proyecto mío (seguro, no crítico) debido a esta publicación. Gracias.
Dario
44
Para lo que vale, usamos libphonenumber para normalizar el número antes de que entre en la base de datos, de esa manera no necesitamos depender (en el momento de la escritura) de los complementos de postgres de calidad alfa que no se pueden usar en RDS y otras implementaciones de postgres basadas en la nube.
John Hamelink