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

Eva*_*oll 17 postgresql datatypes data-integrity data-validation

假设我想将电话号码存储在数据库中。我可以接受来自美国以外的电话号码。我将如何存储这些电话号码?

Eva*_*oll 23

libphonenumber

如果可能,请始终使用规范形式。形式越规范化越好。如果有标准,请使用它。对于这个问题,让我们使用谷歌的libphonenumber,通过pg-libphonenumber 的代理。

CREATE EXTENSION pg_libphonenumber;
Run Code Online (Sandbox Code Playgroud)

这当前安装phone_number具有比较运算符和函数的类型。它以国际规范形式存储数字。在我看来,这是最好的妥协。

parse_phone_number('textnumber', 'CountryCode');
Run Code Online (Sandbox Code Playgroud)

因为我们可以判断电话号码何时彼此相等并且我们提供了内部范式,所以我们可以这样做..

SELECT parse_phone_number('03 7010 1234', 'AU') = parse_phone_number('(03) 7010 1234', 'AU');
Run Code Online (Sandbox Code Playgroud)

(返回真)。这也意味着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
Run Code Online (Sandbox Code Playgroud)

那投入..

 parse_phone_number 
--------------------
 +61 3 7010 1234
(1 row)
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,该包似乎处于 *alpha* 状态超过 1 年......如果您尝试在生产中使用它,建议高度小心。 (8认同)
  • 为文档做贡献就是在做贡献。;) 由于这篇文章,我将在我的(安全的,非关键的)项目中使用 libphonenumber。谢谢你。 (6认同)
  • 就其价值而言,我们使用 libphonenumber 在数字进入数据库之前对其进行规范化 - 这样我们就不需要依赖(在撰写本文时)无法在 RDS 中使用的 alpha 质量 postgres 插件和其他基于云的 postgres 部署。 (5认同)
  • @joanolo你是对的,但似乎新的贡献者埃文卡罗尔今天刚刚做出了新的承诺......有人会考虑埃文的所有这些自我推销,但我也赞成这个自我回答,因为他很积极为扩展做出贡献...... (3认同)
  • 我只对文档“做出了贡献”。而且,我在发布之前这样做了,就像我一直在改进文档一样。在任何有用的意义上,我都不是“贡献者”。我没有提交位。我不写 C++ 代码。我只是热衷于在 PgSQL 和其他了解它们以及如何使用它们的人中绑定 libphonenumber。 (3认同)