首页 > web前端 > js教程 > 在应用程序中存储电话号码的最佳方式

在应用程序中存储电话号码的最佳方式

Susan Sarandon
发布: 2024-12-29 17:49:13
原创
1001 人浏览过

Best way to store phone numbers in your app

在后端存储电话号码时,考虑效率、标准化、验证和国际化至关重要。存储电话号码的最佳方式通常取决于应用程序的需求(例如国际支持、验证规则、格式要求)。

选项 1:存储完整的电话号码和国家/地区代码

此方法以国际 E.164 格式(这是国际公认的电话号码格式)存储完整的电话号码,包括国家/地区代码。

为什么选择 E.164 格式?

  • 标准化:E.164 是全球公认的电话号码格式,可确保唯一性。它包含国家/地区代码并删除所有格式字符(例如空格、连字符或括号),只留下数字。
  • 一致性:通过以 E.164 格式存储电话号码,可以避免不同用户和系统之间的格式不一致。

  • 验证:您可以使用 libphonenumber(Google 使用)等库轻松验证电话号码,以验证电话号码格式正确且对于特定国家/地区有效。

E.164 格式示例:

  • 美国:18005555555
  • 英国:442079460958
  • 印度:919167988354

如何储存:

数据库架构:将电话号码存储为 E.164 格式的单个字符串字段。
字段类型:String 或 VARCHAR(取决于数据库)。
示例:VARCHAR(15)(E.164 最多允许 15 位数字)。

优点:

  • 国际化:支持全球所有号码,让您的系统轻松适应任何国家。
  • 简化逻辑:由于电话号码以统一格式存储,因此您无需处理格式、验证或国家/地区代码提取的变化。
  • 无冗余数据:您存储一种规范格式,降低了冗余或不一致数据的风险。

缺点:

  • 用户体验:用户必须输入完整的电话号码和国家/地区代码,这可能并不适合所有用例(例如,仅输入本地号码)。
CREATE TABLE users (
  id INT PRIMARY KEY,
  phone_number VARCHAR(15) NOT NULL
);

登录后复制
登录后复制

选项 2:使用单独的国家/地区代码存储电话号码

在此方法中,您将电话号码分为两个字段:一个用于国家/地区代码,另一个用于本地号码。这为本地化格式提供了更大的灵活性,如果您的应用程序需要按区域划分不同的电话号码行为(例如验证规则、格式显示),这可能会更好。

CREATE TABLE users (
  id INT PRIMARY KEY,
  phone_number VARCHAR(15) NOT NULL
);

登录后复制
登录后复制

优点:

  • 本地化输入。
  • 轻松格式化
  • 简化的解析。

缺点:

  • 更复杂的逻辑:您可能需要额外的逻辑来分别管理国家/地区代码和本地号码,特别是在验证或重建号码以进行显示时。
  • 潜在的冗余:如果用户频繁更改国家/地区代码或电话号码,您可能会遇到冗余问题,尤其是在跨不同系统处理多个条目时。

最佳实践示例 (E.164):

以下是处理 E.164 格式的电话号码和 libphonenumber 以在 Node.js 中进行验证的完整示例:

  1. 安装 libphonenumber
CREATE TABLE users (
  id INT PRIMARY KEY,
  country_code VARCHAR(5) NOT NULL,
  local_number VARCHAR(20) NOT NULL
);
登录后复制
  1. 示例代码(Node.js/Express)
npm install google-libphonenumber
登录后复制

从电话号码中检索国家/地区代码

要使用此库从电话号码检索国家/地区代码(例如 US 表示美国),您可以使用 getRegionCodeForNumber 函数。此函数接受一个电话号码(必须使用 parseAndKeepRawInput 或类似方法进行解析)并返回 ISO 3166-1 alpha-2 格式的国家/地区代码(例如 IN、US、GB 等)。

工作示例 -

const { PhoneNumberUtil, PhoneNumberFormat } = require('google-libphonenumber');
const phoneUtil = PhoneNumberUtil.getInstance();

const validatePhoneNumber = (phoneNumber, countryCode) => {
  try {
    const number = phoneUtil.parseAndKeepRawInput(phoneNumber, countryCode);
    const isValid = phoneUtil.isValidNumber(number);
    const formattedNumber = phoneUtil.format(number, PhoneNumberFormat.E164);

    return {
      isValid,
      formattedNumber
    };
  } catch (error) {
    return { isValid: false, error: 'Invalid phone number' };
  }
};

// Example usage
const { isValid, formattedNumber } = validatePhoneNumber('800-555-5555', 'US');
console.log(isValid, formattedNumber);  // true, +18005555555
登录后复制

解释:

  • parseAndKeepRawInput(phoneNumber):
    此方法用于解析电话号码并保留原始输入,这意味着它可以处理各种格式的输入(例如,带有空格、破折号或括号)。

  • getRegionCodeForNumber(number):
    此函数返回与解析的电话号码关联的国家/地区代码(ISO 3166-1 alpha-2 代码,例如 IN、US、GB 等)。
    它通过将号码与特定于国家/地区的电话号码模式的内部列表进行匹配来实现此目的。

预期输出

const { PhoneNumberUtil } = require('google-libphonenumber');
const phoneUtil = PhoneNumberUtil.getInstance();

// Function to get country code (ISO 3166-1 alpha-2)
const getCountryCodeFromPhoneNumber = (phoneNumber) => {
  try {
    // Parse the phone number and get the region (country code)
    const number = phoneUtil.parseAndKeepRawInput(phoneNumber);
    const countryCode = phoneUtil.getRegionCodeForNumber(number);
    return countryCode;
  } catch (error) {
    console.error("Error parsing phone number:", error);
    return null;
  }
};

// Test with different phone numbers
const testPhoneNumbers = [
  "+919167988354", // India
  "+14155552671",  // USA
  "+447777123456", // UK
  "+81 90 1234 5678", // Japan
];

testPhoneNumbers.forEach((phoneNumber) => {
  const countryCode = getCountryCodeFromPhoneNumber(phoneNumber);
  console.log(`Phone number: ${phoneNumber}, Country Code: ${countryCode}`);
});

登录后复制

重要考虑因素:

  • 电话号码必须正确解析,并且应包含国家/地区代码(后跟数字)。如果电话号码是本地格式(不带国家代码),则解析时需要指定默认地区(国家)。

  • 默认区域:如果电话号码不包含国家/地区代码,您可以使用 parse 方法提供默认国家/地区代码(例如,phoneUtil.parse(phoneNumber, 'IN' ) 代表印度)。

结论:

  • E.164 格式通常是在后端存储电话号码的最佳选择,因为它得到普遍认可并简化了验证和存储。
  • 单独存储国家/地区代码和本地号码在本地化系统中很有用,但会增加复杂性。
  • 使用 libphonenumber 等工具高效处理电话号码验证、格式化和解析。

以上是在应用程序中存储电话号码的最佳方式的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板