ఫోన్ నంబర్ల నిల్వలో (storage) తేడాల వల్ల ఒక లాగిన్ వైఫల్యం జరిగి, ఒక లోపం బయటపడింది. ఒక యూజర్ ఖాతా బ్లాక్ చేయబడింది, ఎందుకంటే డేటాబేస్‌లో ఒకే జర్మన్ మొబైల్ నంబర్ రెండు రూపాల్లో ఉంది—ఒక రో (row)లో 0171 5550134 మరియు మరొక రోలో +49 171 5550134—దీనివల్ల సిస్టమ్ వాటిని వేర్వేరు ఎంట్రీలుగా పరిగణించింది. ఫలితం: OTP అసలు రాలేదు, మరియు "send code" బటన్ ఒక జూదంలా మారింది.

ఫోన్ నంబర్లు తేదీల కంటే ఎందుకు కష్టమైనవి

ఫోన్ నంబర్ ఇన్‌పుట్‌ను నియంత్రించడానికి డెవలపర్లు తరచుగా regex పై నమ్మకం ఉంచుతారు. ఒక నంబర్ సరిహద్దు దాటినప్పుడు లేదా జాతీయ ప్లాన్ మారినప్పుడు ఆ నమ్మకం చెడిపోతుంది. తేదీలు ఊహించదగిన క్యాలెండర్‌ను అనుసరిస్తాయి; కానీ ఫోన్ నంబర్లు క్యారియర్లు, నిబంధనలు మరియు సాంస్కృతిక పద్ధతులతో మారుతూ ఉంటాయి.

రా స్ట్రింగ్స్ (raw strings) వల్ల కలిగే దాగి ఉన్న ఖర్చు

ఫోన్ నంబర్‌ను ప్లెయిన్ స్ట్రింగ్‌గా నిల్వ చేయడం ప్రత్యేకంగా అనిపించవచ్చు—కానీ రెండు రూపాలు ఒకే లైన్‌ను సూచించే వరకు మాత్రమే. "నిర్దిష్ట" నంబర్ కోసం డేటాబేస్‌ను క్వెరీ చేసే OTP సిస్టమ్‌లు, డూప్లికేట్ నంబర్‌కు కోడ్‌ను పంపుతాయి, అది యూజర్‌కు ఎప్పటికీ చేరుకోదు.

నంబర్లు నంబరిక్ ఫీల్డ్స్‌లో ఉన్నప్పుడు సమస్య మరింత తీవ్రమవుతుంది. ఒక BIGINT కాలమ్ ముందున్న + మరియు సున్నాలను తొలగించి, +49 171 5550134 ను 491715550134 గా మారుస్తుంది. ప్లస్ గుర్తు లేకుండా, అసలు ఫార్మాట్‌ను తిరిగి పొందడం అనేది ఒక ఊహగా మిగిలిపోతుంది.

E.164 ఒప్పందం (contract)

అంతర్జాతీయ టెలిఫోన్ నంబరింగ్ ప్లాన్, E.164, ఒకే ఒక పోర్టబుల్ ప్రాతినిధ్యాన్ని నిర్వచిస్తుంది:

  • + తో మొదలవుతుంది
  • తర్వాత 1 నుండి 3 అంకెల కంట్రీ కోడ్ ఉంటుంది
  • ఆ తర్వాత సబ్‌స్క్రైబర్ నంబర్
  • మొత్తం 15 అంకెలకు మించకూడదు
  • స్పేస్‌లు, చుక్కలు (dots) లేదా డ్యాష్‌లు ఉండకూడదు

E.164 నంబర్ యాక్టివ్‌గా ఉందని గ్యారెంటీ ఇవ్వదు; ఆ స్ట్రింగ్ సరైన స్ట్రక్చరల్ ప్యాటర్న్‌ను అనుసరిస్తుందని మాత్రమే ఇది గ్యారెంటీ ఇస్తుంది. దీనిని ఒక ఫార్మాట్ కాంట్రాక్ట్‌గా పరిగణించండి, కనెక్ట్ అవుతుందో లేదో చెప్పే సాధనంగా (oracle) కాదు.

regex పరిష్కరించలేని సాధారణ లోపాలు

  • Numeric storage – BIGINT అనేది + మరియు ముందున్న సున్నాలను తొలగిస్తుంది. దానికి బదులుగా టెక్స్ట్ కాలమ్‌ను (TEXT లేదా VARCHAR) ఉపయోగించండి.
  • Hard-coded regexes – జాతీయ ప్లాన్‌లు మారుతుంటాయి. మెక్సికో 2019లో తన ట్రంక్ ప్రిఫిక్స్‌ను తొలగించింది; అర్జెంటీనా ఇప్పుడు మొబైల్ లైన్ల కోసం కంట్రీ కోడ్ తర్వాత 9 ను కోరుతోంది. ఒక స్టాటిక్ ప్యాటర్న్ త్వరగా పాతబడిపోతుంది.
  • Blind zero stripping – ఇటాలియన్ ల్యాండ్‌లైన్‌లు ముందున్న సున్నాను ఉంచుతాయి, జర్మన్ నంబర్లు ఉంచవు. "ముందున్న సున్నాలను తొలగించు" అనే సాధారణ నియమం ఇటాలియన్ డేటాను దెబ్బతీస్తుంది, అదే సమయంలో జర్మన్ నంబర్లను మార్చదు.
  • Assuming format equals deliverability – libphonenumber స్ట్రక్చర్‌ను ధృవీకరిస్తుంది కానీ హ్యాండ్‌సెట్ ఆన్‌లో ఉందో లేదో లేదా నంబర్ పోర్ట్ చేయబడిందో లేదో చెప్పలేదు.

నమ్మదగిన పైప్‌లైన్‌ను నిర్మించడం

  1. దేశాన్ని అడగండి – సైన్-అప్ ఫారమ్‌లలో కంట్రీ సెలెక్టర్ను జోడించి, ఆ రీజియన్‌ను పార్సర్‌కు పంపండి.
  2. లైవ్ ఫార్మాటింగ్‌ను చూపండి – "AsYouType" ఫార్మాటింగ్‌ను ఉపయోగించండి, తద్వారా యూజర్లు టైప్ చేస్తున్నప్పుడు సరైన ప్యాటర్న్‌ను చూడగలరు.
  3. Validate on blur – ప్రతి కీస్ట్రోక్ వద్ద కాకుండా, యూజర్ ఫీల్డ్ నుండి వెళ్ళిన తర్వాత వాలిడేషన్‌ను రన్ చేయండి; ఇది ఇబ్బందిని తగ్గిస్తుంది.
  4. E.164 స్ట్రింగ్‌ను మాత్రమే భద్రపరచండి – నార్మలైజ్ చేయబడిన + ప్రిఫిక్స్ ఉన్న నంబర్‌ను డేటాబేస్‌లో నిల్వ చేయండి.
  5. Format at the edge – UI లేదా ఈమెయిల్ టెంప్లేట్‌లలో మాత్రమే మళ్ళీ యూజర్ ఫ్రెండ్లీ లేఅవుట్‌లోకి మార్చండి.

లెగసీ డేటాను మైగ్రేట్ చేసేటప్పుడు, వాలిడేషన్‌లో విఫలమైన రోస్‌ను ఉంచండి. ప్రతి ఎంట్రీని కొత్త కాలమ్‌లోకి పార్స్ చేయండి, వైఫల్యాలను గుర్తించండి (flag) మరియు ఒక రిపోర్ట్‌ను రూపొందించండి. సైలెంట్‌గా డేటాను తొలగించడం వల్ల సపోర్ట్ టికెట్లు పెరుగుతాయి, ఇవి తర్వాత ఖరీదైన పరిష్కారాలుగా మారుతాయి.

డెవలపర్ల కోసం ఒక క్విక్ చెక్‌లిస్ట్

  • నంబర్లను E.164 ఫార్మాట్‌లో TEXT/VARCHAR గా నిల్వ చేయండి.
  • Google యొక్క libphonenumber లైబ్రరీని ఉపయోగించండి; ఇది గ్లోబల్ ప్లాన్‌ల యొక్క క్లిష్టమైన వాస్తవాలను హ్యాండిల్ చేస్తుంది.
  • కంట్రీ కోడ్‌ను వదిలేసిన యూజర్ల కోసం డిఫాల్ట్ రీజియన్‌ను అందించండి.
  • లైవ్ సైన్-అప్‌ల కోసం is_valid_numberని కాల్ చేయండి; ఇది నంబర్ ప్రాంతీయ నిబంధనలకు సరిపోతుందో లేదో తనిఖీ చేస్తుంది.
  • బల్క్ డేటాను క్లీన్ చేసేటప్పుడు is_possible_numberని ఉపయోగించండి; ఇది బోర్డర్‌లైన్ కేసులను తిరస్కరించకుండానే స్పష్టంగా తప్పుగా ఉన్న ఎంట్రీలను గుర్తిస్తుంది.

సరైన ఫోన్ నంబర్ హ్యాండ్లింగ్ అనేది కేవలం ఒక అదనపు ఫీచర్ కాదు; నమ్మదగిన యూజర్ కాంటాక్ట్‌పై ఆధారపడే ఏ సిస్టమ్‌కైనా ఇది ఒక ప్రాథమిక అవసరం. E.164కి నార్మలైజ్ చేయడం మరియు పార్సింగ్‌ను పరీక్షించబడిన లైబ్రరీకి అప్పగించడం ద్వారా, డెవలపర్లు నమ్మకాన్ని మరియు ఆదాయాన్ని నిశ్శబ్దంగా దెబ్బతీసే బగ్‌లను తొలగించవచ్చు. ఫోన్ నంబర్లను ఫ్రీ-ఫామ్ టెక్స్ట్‌గా కాకుండా స్ట్రక్చర్డ్ డేటాగా పరిగణించండి మరియు ప్రమాణాలను (standards) వాటి పనిని చేయనివ్వండి.