Existe-t-il un standard pour stocker les numéros de téléphone normalisés dans une firebase database?

Qu’est-ce qu’une bonne structure de données pour stocker les numéros de téléphone dans les champs de firebase database? Je suis à la recherche de quelque chose de suffisamment flexible pour gérer les numéros internationaux, et aussi de quelque chose qui permette de consulter efficacement les différentes parties du numéro.

Edit: Juste pour clarifier le cas d’utilisation ici: je stocke actuellement des numéros dans un seul champ varchar, et je les laisse juste comme le client les a entrés. Ensuite, lorsque le code est requirejs par code, je le normalise. Le problème est que si je veux interroger quelques millions de lignes pour trouver des numéros de téléphone correspondants, cela implique une fonction, comme

where dbo.f_normalizenum(num1) = dbo.f_normalizenum(num2) 

ce qui est terriblement inefficace. Les requêtes qui recherchent des éléments comme l’indicatif régional deviennent extrêmement délicates lorsqu’il ne s’agit que d’un seul champ varchar.

[Modifier]

Les gens ont fait beaucoup de bonnes suggestions ici, merci! En tant que mise à jour, voici ce que je fais maintenant: je stocke toujours les nombres exactement tels qu’ils ont été entrés, dans un champ varchar, mais au lieu de normaliser les choses au moment de la requête, j’ai un déclencheur ou mis à jour J’ai donc des ints ou des bigints pour toutes les parties que je dois interroger, et ces champs sont indexés pour que les requêtes s’exécutent plus rapidement.

Tout d’abord, au-delà du code pays, il n’y a pas de véritable norme. Le mieux que vous puissiez faire est de reconnaître, par le code du pays, le pays auquel appartient un numéro de téléphone particulier et de traiter le rest du numéro selon le format de ce pays.

Généralement, cependant, le matériel téléphonique est normalisé afin que vous puissiez presque toujours diviser un numéro de téléphone donné dans les composants suivants

  • C Code pays 1-10 chiffres (actuellement 4 ou moins, mais cela peut changer)
  • Un code de zone (province / état / région) 0-10 chiffres (peut en fait vouloir un champ de région et un champ de zone séparément, plutôt qu’un code de zone)
  • E Exchange (préfixe ou commutateur) code 0-10 chiffres
  • L Numéro de ligne 1-10 chiffres

Avec cette méthode, vous pouvez potentiellement séparer des numéros de telle sorte que vous puissiez trouver, par exemple, des personnes proches les unes des autres car elles ont les mêmes codes de pays, de zones et d’échanges. Avec les téléphones portables, vous ne pouvez plus compter sur eux.

De plus, dans chaque pays, il existe des normes différentes. Vous pouvez toujours compter sur un EEE-LLLL (AAA) aux États-Unis, mais dans un autre pays, vous pouvez avoir des échanges dans les villes (AAA) EE-LLL, et simplement des numéros de ligne dans les zones rurales (AAA) LLLL. Vous devrez commencer en haut dans une arborescence de quelque forme et les formater au fur et à mesure de vos informations. Par exemple, l’indicatif de pays 0 a un format connu pour le rest du numéro, mais pour l’indicatif de pays 5432, vous devrez peut-être examiner l’indicatif régional avant de comprendre le rest du numéro.

Vous pouvez également vouloir manipuler des numéros de vanity tels que (800) Lucky-Guy , ce qui nécessite de reconnaître que s’il s’agit d’un numéro américain, il y a un trop grand nombre de chiffres (et vous devrez peut-être les représenter à des fins publicitaires). les États-Unis les lettres correspondent aux chiffres différemment qu’en Allemagne.

Vous pouvez également stocker le nombre entier séparément en tant que champ de texte (avec internationalisation) afin de pouvoir revenir plus tard et ré-parsingr les numéros au fur et à mesure que les choses changent ou comme sauvegarde si quelqu’un soumet une mauvaise méthode pour parsingr le format d’un pays particulier et perd des informations.

KISS – J’en ai marre de nombreux sites Web américains. Ils ont un code intelligemment écrit pour valider les codes postaux et les numéros de téléphone. Lorsque je tape mes informations de contact norvégiennes parfaitement valides, je trouve que cela est souvent rejeté.

Laissez une chaîne, sauf si vous avez besoin de quelque chose de plus avancé.

La page Wikipedia sur E.164 devrait vous indiquer tout ce que vous devez savoir.

Voici ma structure proposée, j’apprécierais vos commentaires:

Le champ de la firebase database du téléphone doit être un varchar (42) au format suivant:

CountryCode – Numéro x Extension

Ainsi, aux États-Unis, par exemple, nous pourrions avoir:

1-2125551234×1234

Cela représenterait un numéro américain (code de pays 1) avec le code de zone / numéro (212) 555 1234 et l’extension 1234.

En séparant le code du pays par un tiret, le code du pays est clair pour une personne qui consulte les données. Ce n’est pas ssortingctement nécessaire car les codes de pays sont des ” codes de préfixe ” (vous pouvez les lire de gauche à droite et vous pourrez toujours déterminer le pays sans ambiguïté). Mais, comme les codes de pays ont des longueurs variables (entre 1 et 4 caractères pour le moment), vous ne pouvez pas facilement voir le code du pays à moins d’utiliser un séparateur.

J’utilise un “x” pour séparer l’extension car sinon, il ne serait pas possible (dans de nombreux cas) de déterminer quel était le numéro et quelle était l’extension.

De cette manière, vous pouvez stocker l’intégralité du numéro, y compris le code pays et l’extension, dans un seul champ de firebase database, que vous pouvez ensuite utiliser pour accélérer vos requêtes, au lieu de vous connecter à une fonction personnalisée. .

Pourquoi ai-je choisi un varchar (42)? Eh bien, tout d’abord, les numéros de téléphone internationaux seront de longueur variable, d’où le “var”. Je stocke un tiret et un “x”, ce qui explique le “caractère”, et de toute façon, vous ne ferez pas d’arithmétique sur les numéros de téléphone (je suppose), il est donc inutile d’essayer un type numérique. . Quant à la longueur de 42, j’ai utilisé la longueur maximale possible de tous les champs ajoutés, en fonction de la réponse d’Adam Davis, et ajouté 2 pour le tiret et le «x».

Recherchez E.164. Fondamentalement, vous stockez le numéro de téléphone en tant que code commençant par le préfixe de pays et un suffixe optionnel pbx. L’affichage est alors un problème de localisation. La validation peut également être effectuée, mais c’est aussi un problème de localisation (basé sur le préfixe du pays).

Par exemple, + 12125551212 + 202 serait formaté dans l’environnement local en_US en tant que (212) 555-1212 x202. Il aurait un format différent en en_GB ou de_DE .

Il y a pas mal d’informations sur l’UIT-T E.164, mais c’est assez cryptique.

J’aime personnellement l’idée de stocker un numéro de téléphone normalisé varchar (par exemple, 9991234567) puis, bien sûr, de formater ce numéro de téléphone en ligne lorsque vous l’affichez.

De cette façon, toutes les données de votre firebase database sont «propres» et sans formatage.

Peut-être stocker les sections de numéro de téléphone dans différentes colonnes, permettant des entrées vides ou nulles?

Ok, donc sur la base des informations sur cette page, voici un début sur un validateur de numéros de téléphone internationaux:

 function validatePhone(phoneNumber) { var valid = true; var ssortingpped = phoneNumber.replace(/[\(\)\.\-\ \+\x]/g, ''); if(phoneNumber == ""){ valid = false; }else if (isNaN(parseInt(ssortingpped))) { valid = false; }else if (ssortingpped.length > 40) { valid = false; } return valid; } 

Librement basé sur un script de cette page: http://www.webcheatsheet.com/javascript/form_validation.php

Je pense que le texte libre (peut-être varchar (25)) est la norme la plus utilisée. Cela permettra tout format, domestique ou international.

Je suppose que le principal facteur pourrait être la façon dont vous interrogez ces chiffres et ce que vous en faites.

Je trouve que la plupart des formulaires Web acceptent correctement le code du pays, l’indicatif régional, puis les 7 chiffres restants, mais oublient presque toujours de permettre l’entrée d’une extension. Cela finit presque toujours par me faire dire des mots en colère, car au travail nous n’avons pas de réceptionniste, et mon poste est nécessaire pour me joindre.

Je trouve que la plupart des formulaires Web acceptent correctement le code du pays, l’indicatif régional, puis les 7 chiffres restants, mais oublient presque toujours de permettre l’entrée d’une extension. Cela finit presque toujours par me faire dire des mots en colère, car au travail nous n’avons pas de réceptionniste, et mon poste est nécessaire pour me joindre.

Je devrais vérifier, mais je pense que notre schéma de firebase database est similaire. Nous détenons un code de pays (il pourrait s’agir par défaut des États-Unis, pas sûr), un indicatif régional, 7 chiffres et une extension.

Qu’en est-il du stockage d’une colonne de texte libre qui montre une version conviviale du numéro de téléphone, puis une version normalisée qui supprime les espaces, les crochets et développe «+». Par exemple:

Convivial: +44 (0) 181 4642542

Normalisé: 00441814642542

La norme pour le formatage des numéros est e.164 . Vous devez toujours stocker les numéros dans ce format. Vous ne devez jamais autoriser le numéro de poste dans le même champ avec le numéro de téléphone, ceux-ci doivent être stockés séparément. Quant à numérique vs alphanumérique, cela dépend de ce que vous allez faire avec ces données.

Je choisirais un champ libre et un champ contenant une version purement numérique du numéro de téléphone. Je laisserais la représentation du numéro de téléphone à l’utilisateur et utiliserais le champ normalisé spécifiquement pour les comparaisons de numéros de téléphone dans les applications basées sur TAPI ou pour essayer de trouver des entrées doubles dans un annuaire téléphonique. Bien sûr, cela ne nuit pas à l’utilisateur avec un schéma d’entrée qui ajoute de l’intelligence, comme des champs séparés pour le code du pays (si nécessaire), l’indicatif régional, le numéro de base et l’extension.

Où trouvez-vous les numéros de téléphone? Si vous les obtenez d’une partie du réseau téléphonique, vous obtenez une chaîne de chiffres et un type de numéro et un plan, par exemple

441234567890 type / plan 0x11 (qui signifie international E.164)

Dans la plupart des cas, la meilleure chose à faire est de stocker toutes ces données telles quelles et de les normaliser pour l’affichage, bien que le stockage de numéros normalisés puisse être utile si vous souhaitez les utiliser comme clé unique ou similaire.

Convivial: +44 (0) 181 464 2542 normalisé: 00441814642542

Le (0) n’est pas valide au format international. Voir la norme UIT-T E.123.

Le format “normalisé” ne serait pas utile pour les lecteurs américains car ils utilisent 011 pour un access international.

J’ai utilisé 3 méthodes différentes pour stocker des numéros de téléphone en fonction des exigences d’utilisation.

  1. Si le numéro est stocké uniquement pour une récupération humaine et ne sera pas utilisé pour rechercher son numéro stocké dans un champ de type chaîne exactement comme l’utilisateur l’a entré.
  2. Si le champ doit faire l’object d’une recherche, tous les caractères supplémentaires, tels que +, les espaces et les crochets, sont supprimés et le nombre restant est stocké dans un champ de type chaîne.
  3. Enfin, si le numéro de téléphone doit être utilisé par un ordinateur / une application téléphonique, il devra alors être saisi et stocké sous la forme d’un numéro de téléphone valide utilisable par le système, cette option étant évidemment la plus difficile à coder. pour.

Espace de rangement

Stockez les téléphones dans la RFC 3966 (comme +1-202-555-0252 , +1-202-555-7166;ext=22 ). La principale différence avec E.164 est

  • Aucune limite sur la longueur
  • Prise en charge des extensions

Pour optimiser les performances des opérations d’affichage, stockez le téléphone au format national / international à côté du champ RFC 3966.

Ne stockez pas le code du pays dans un champ distinct, sauf si vous avez une raison sérieuse. Pourquoi? Parce que vous ne devriez pas demander le code pays sur l’interface utilisateur.

La plupart du temps, les gens entrent dans les téléphones comme ils les entendent. Par exemple, si le format local commence à 0 ou 8 , il serait embêtant pour l’utilisateur de transformer le numéro dans la tête (comme ” OK, ne tapez pas” 0 “, choisissez le pays et tapez le rest de ce que la personne a dit dans ce domaine “).

Analyse

Google a votre dos et vous pouvez valider et parsingr n’importe quel numéro de téléphone à l’aide de leur bibliothèque libphonenumber . Il existe des ports pour presque toutes les langues.

Laissez simplement l’utilisateur entrer simplement ” 0449053501 ” ou ” 04 4905 3501 ” ou ” (04) 4905 3501 “. L’outil déterminera le rest pour vous.

Voir la démo officielle , pour avoir une idée de combien cela aide.