Предположим, я хочу хранить телефонные номера в базе данных. Я могу принимать номера телефонов за пределами Соединенных Штатов. Как бы я занялся хранением этих телефонных номеров?
Предположим, я хочу хранить телефонные номера в базе данных. Я могу принимать номера телефонов за пределами Соединенных Штатов. Как бы я занялся хранением этих телефонных номеров?
Ответы:
libphonenumber
По возможности всегда используйте каноническую форму. Чем больше нормализуется форма, тем лучше. Если есть стандарт, используйте его. Для этой проблемы давайте использовать Google libphonenumber по доверенности 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)