Załóżmy, że chcę przechowywać numery telefonów w bazie danych. Mogę przyjmować numery telefonów spoza Stanów Zjednoczonych. Jak mógłbym przechować te numery telefonów?
Załóżmy, że chcę przechowywać numery telefonów w bazie danych. Mogę przyjmować numery telefonów spoza Stanów Zjednoczonych. Jak mógłbym przechować te numery telefonów?
Odpowiedzi:
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_number
typ, 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 DISTINCT
dział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)