web-dev-qa-db-fra.com

Stocker le numéro de téléphone dans E.164

TLDR; Si je stocke un numéro de téléphone dans MySQL (ou une DB avec des contraintes équivalentes), le format correct serait-il des valeurs E.164 dans un varchar ( 32) champ?

Ont lu le format/stockage de numéros de téléphone internationaux. Dans le passé pour diverses raisons, il a été suggéré de stocker en tant que chaîne en raison de ces données, un identifiant n'est pas un nombre réel (ainsi que des problèmes tels que les cadres supérieurs). Je suis conscient que je ne devrais pas tenter d'analyser/valider les numéros de téléphone via regex, et que LibphonenNumber développé par Google est généralement recommandé de manipuler cela et de produire des valeurs formatées E.164.

Je suppose que c'est sûr de dire que E.164 est le meilleur format de stockage adapté aux numéros de téléphone aujourd'hui. Comme le dirigeant + ne semble pas nécessairement nécessaire et que les 0 précédents ne se produiraient pas dans ce format? J'ai vu BigintIn (15) suggéré de stocker cela dans des bases de données MySQL. Cela nécessiterait un champ supplémentaire (chaîne?) Pour prendre en charge les numéros de téléphone avec des numéros d'extension. Il n'est pas indiqué sur l'article de Wikipedia, mais j'ai vu de nombreuses mentions dans des publications de blog que le format E.164 prend en charge les extensions en ajoutant "EXT = 12345" afin qu'il soit donc plus conseillé de stocker dans un champ de varchar [32)? "+19995556789; EXT = 12345", 32 doit être la longueur maximale avec ce format, de sorte que la longueur de 32 est appropriée? <+> <; ext =>

EDIT: Je ne sais pas exactement quelle devrait être la valeur de l'extension, selon ceci Il est 11, mais le article lié a été modifié depuis et archivé par Apple, Il n'y a pas d'informations claires sur la longueur de l'extension. Serait-il mieux juste à une limite plus élevée telle que Varchar (50) ou aller avec Bigint (15) et un champ supplémentaire pour des extensions qui sont nullables?

5
Brennan

BIGINT(15) ou même BIGINT(18) peut ne pas être suffisamment longue pour stocker tous les numéros de téléphone possibles. Selon quel pays et si un PBX est impliqué 18 chiffres ne sera pas suffisant. J'ai déjà vu un certain nombre de personnes déjà plus longues. Même si E.164 recommande de ne pas attribuer de numéros de téléphone avec Plus de 15 chiffres des fournisseurs de téléphones dans le monde entier, pas tous adhèrent à ces normes.

Je ne sais pas si vous vous dirigez exactement avec votre base de données, mais si vous souhaitez stocker des numéros de téléphone, je suggère fortement d'utiliser un format basé sur le personnage. Dans la plupart des applications qui utilisent vraiment des numéros de téléphone, vous pouvez non seulement les stocker, mais aussi les utiliser. Pour utiliser un numéro de téléphone, vous pourriez avoir besoin de quelques transformations pour ajouter, modifier ou remplacer les préfixes, ou peut-être filtrer pour certains préfixes, car les numéros de téléphone internationaux n'ont pas la même longueur, il est beaucoup plus facile et plus rapide de la base de données pour utiliser un personnage basé sur la base. format comme CHAR(32) ou VARCHAR(32). Si la vitesse des opérations de filtrage basées sur le caractère (modèle de numéro, préfixes, codes de zone, etc.) est importante pour vous, le CHAR typs surperformez généralement VARCHAR mais vous devrez nettoyer les espaces de fuite. À l'échelle internationale, il existe deux manières courantes de réaliser directement dans les lignes de cadran. Je les appellerais "Direct Dial" et "Cadran post-connexion". Tout numéro de numérotation directe peut être placé dans le champ Numéro "régulier" car ils peuvent être composés en une succession avec le numéro attribué au transporteur. L'autre type nécessite généralement une pause avant de continuer à composer l'extension (comme dans la plupart des plus petits hérités américains PBX) ces "chiffres post-cadrans" devraient entrer dans un champ distinct, qui pour une meilleure conception devrait Soyez nullable. Je n'utiliserais pas le format d'extension E.164 que vous avez mentionné, il est si rarement utilisé que, dans moi-même travaillant dans l'industrie depuis plus de 10 ans, je ne l'ai jamais vue dans la production.

1
fgwaller