如何在PostgreSQL中存储电话号码?


Answers:


21

libphonenumber

如果可能,请始终使用规范形式。形式越规范化越好。如果有标准,请使用它。对于这个问题,让我们使用谷歌的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');

(返回true)。这也意味着它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)

8
不幸的是,该包装盒似乎处于alpha状态超过1年。
joanolo

2
@joanolo您说得对,但似乎新的撰稿人Evan Carroll就在今天做出了新的承诺……有人会考虑Evan的所有这种自我推崇,但我赞成这种自我回答,因为他很积极为扩展做出了贡献……
Dario

3
我只是“贡献”了文档。而且,我这样做之前,我一直以改进文档的方式发布。从任何有用的意义上来说,我都不是“贡献者”。我没有提交位。我不写C ++代码。我只是热衷于在PgSQL中拥有libphonenumber绑定,并且其他人也了解它们以及如何使用它们。
埃文·卡罗尔

5
为文档做贡献。;)由于这篇文章,我将在我的(安全,非关键)项目中使用libphonenumber。谢谢。
达里奥

4
对于它的价值,我们使用libphonenumber在将数字输入数据库之前对其进行规范化-这样,我们就不必依赖(在撰写本文时)无法在RDS中使用的alpha品质的postgres插件。以及其他基于云的postgres部署。
John Hamelink '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.