Wie speichere ich Telefonnummern in PostgreSQL?

Antworten:

21

libphonenumber

Verwenden Sie nach Möglichkeit immer die kanonische Form. Je normaler die Form, desto besser. Wenn es einen Standard gibt, verwenden Sie ihn. Verwenden wir für dieses Problem Googles libphonenumber als Proxy von pg-libphonenumber .

CREATE EXTENSION pg_libphonenumber;

Dies installiert derzeit den phone_numberTyp, der Vergleichsoperatoren und -funktionen hat. Es speichert die Nummer in einer internationalen kanonischen Form. Dies ist meiner Meinung nach der beste Kompromiss.

parse_phone_number('textnumber', 'CountryCode');

Da wir feststellen können, wann die Telefonnummern einander entsprechen und wir eine interne Normalform bereitstellen, können wir dies tun.

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

(gibt true zurück). Dies bedeutet auch, dass dies DISTINCTfunktioniert, damit wir den gewünschten Effekt erzielen.

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

Das setzt in ..

 parse_phone_number 
--------------------
 +61 3 7010 1234
(1 row)
Evan Carroll
quelle
8
Leider scheint die Verpackung länger als 1 Jahr im Alpha- Zustand zu sein ... Bei der Verwendung in der Produktion ist besondere Vorsicht geboten.
Joanolo
2
@joanolo Sie haben Recht, aber es scheint, dass ein neuer Mitwirkender, Evan Carroll, gerade heute eine neue Zusage gemacht hat ... Jemand würde all diese Eigenwerbung von Evans Seite in Betracht ziehen, aber ich habe diese Selbstantwort auch deshalb positiv bewertet, weil er aktiv ist Beitrag zur Erweiterung ...
Dario
3
Ich habe nur zur Dokumentation "beigetragen". Und das habe ich getan, bevor ich dies auf dieselbe Weise gepostet habe, wie ich es immer tue, um die Dokumentation zu verbessern. Ich bin in keinem nützlichen Sinne ein "Mitwirkender". Ich habe kein Commit-Bit. Ich schreibe keinen C ++ - Code. Ich bin nur leidenschaftlich daran interessiert, dass libphonenumber in PgSQL eingebunden wird und andere wissen, wie sie verwendet werden.
Evan Carroll
5
Beiträge zur Dokumentation leisten Beiträge. ;) Und ich werde wegen dieses Posts libphonenumber in einem (sicheren, nicht kritischen) Projekt von mir verwenden. Vielen Dank.
Dario
4
Wir verwenden libphonenumber, um die Zahl zu normalisieren, bevor sie in die Datenbank eingeht. Auf diese Weise müssen wir (zum Zeitpunkt des Schreibens) nicht auf Postgres-Plugins in Alpha-Qualität angewiesen sein, die in RDS nicht verwendet werden können und andere cloudbasierte Postgres-Bereitstellungen.
John Hamelink