首页 > 解决方案 > 数据库:最佳实践国家、国家代码、国家电话代码

问题描述

如果您将国家/地区代码存储在数据库中但找不到“这是正确的方法”,我正在寻找“最佳实践”。我想存储 2 个字符的国家代码以及国家电话代码(例如德国将是“DE”和“+49”)。

实际上我的计划如下:创建一张表countries和一张表country_codes。像这样的东西:

TABLE: countries
id INT(11)
code CHAR(2)

TABLE: country_codes
id INT(11)
country_id INT(11) FORGEIGN KEY (countries -> id)
phone_code VARHAR(6)

我想我需要把它们分开,因为有些国家有不止一个电话代码。这样一个国家就可以有多个电话代码。

但是对于我的问题:这是做到这一点的“最佳实践”吗?如果我想在“所有”国家/地区推出我的应用程序,或者如果我想将应用程序翻译成多种语言(在这种情况下,我countries也想将该表用于不同的语言。

如果您希望能够在不需要重新编码的情况下将您的应用程序翻译成任何语言,并且您还需要应用程序中所有国家/地区的列表,那么您的方式是什么?

如果它应该重要:我打算为这个应用程序使用 laravel。

标签: phpmysqllaravellaravel-5internationalization

解决方案


国家/地区代码由 ISO 3166-1-alpha-2 标准化为两个字母,因此以这种方式存储它们是可行的。在表中包含国家名称通常很有帮助,因此用户无需知道所有代码即可选择正确的国家/地区。

电话号码的标准化程度要低得多。ITU 提供了E.164 建议来表示实际的电话号码(在电话术语中称为“目录号码”)。国家代码被定义为一到三位数字。北美(包括美国、加拿大和许多加勒比国家)都是北美编号计划的一部分并共享国家代码1

目录号码通常以 + 开头,并以点作为标点。因此,例如,公布的纽约市查号服务号码是(或者当他们仍然有这样的服务时) +1.212.555.1212。如果您从欧洲某个地方拨打该号码,您会看到+并替换您当地的国际前缀。在 NANP 中,多个国籍具有相同的国家代码。

但是,英国很奇怪。从国外打过来,是+44.exchange.number。但是从国内拨打长途电话是(0) exchange.number

我的观点:如果您尝试在软件中使用国家/地区代码编写目录号码,则很难做到正确。您最好要求用户提供带有国际前缀的电话号码。

您绝对不应该将 E.164 国家代码与 ISO 3166 两个字母的国家代码联系起来,将它们作为不同的列放在表的同一行上。您需要两个单独的表来作为未来的证明。标准化组织是不同的,做自己的事情,所以你的数据模型应该反映这一点。

阅读本文: 程序员相信电话号码的谎言。


推荐阅读