99 votes

Comment stocker des numéros de téléphone dans des bases de données MySQL ?

Duplicata possible :
mysql datatype pour le numéro de téléphone et l'adresse

Avez-vous des suggestions sur les meilleures pratiques pour stocker les numéros de téléphone dans une base de données ? Prenons l'exemple d'un numéro de téléphone américain :

  • 555 555 1212
  • 555-555-1212
  • (555) 555 1212
  • 5555551212
  • 1-555-555-1212
  • 1 (555) 555-1212
  • et ainsi de suite ...

Dois-je supprimer le formatage et ne conserver que les chiffres ? Dois-je utiliser un seul champ ou les diviser en : code pays, code région, numéro de téléphone, etc. Des suggestions ?

5 votes

187voto

gbn Points 197263
  • Tous en tant que varchar (ce ne sont pas des nombres mais des "collections de chiffres")
  • Pays + région + numéro séparément
  • Tous les pays n'ont pas d'indicatif régional (par exemple Malte, où je me trouve).
  • Dans certains pays, le zéro initial de l'indicatif régional est supprimé lors de la numérotation interne (par exemple, au Royaume-Uni).
  • Format dans le code client

1 votes

Nous avons eu récemment un besoin similaire. Après analyse, nous avons décidé de le stocker dans 4 champs varchar différents : Code de l'État, Code régional, Numéro et Poste (longueur 5 et facultatif). Vous pouvez inclure un champ distinct pour le pays si vous le souhaitez.

0 votes

Je ne suis pas d'accord avec "ce ne sont pas des nombres". Il est vrai que si l'on pense que les zéros initiaux font partie du nombre, mais ce n'est pas mon cas. Je vois cela comme un moyen d'indiquer à quel niveau se situe le numéro que vous composez. 00 est mondial, 0 est national et sans zéros est local. Je ne pense pas que les zéros initiaux doivent être stockés, ils doivent être ajoutés par l'application qui utilise le numéro.

11 votes

@Andreas Wederbrand : est-ce que vous ajoutez ou soustrayez ou arrondissez ou modulez des numéros de téléphone ? Non.

29voto

Andreas Wederbrand Points 10606

Vous ne devez jamais stocker des valeurs avec le format. Le formatage doit être effectué dans la vue en fonction des préférences de l'utilisateur.

La recherche de nonnes de téléphone avec un formatage mixte est presque impossible.

Dans ce cas, je diviserais les champs et les enregistrerais sous forme de nombres entiers. Les nombres sont plus rapides que les textes et le fait de les diviser et de mettre un index sur eux permet d'exécuter rapidement toutes sortes de requêtes.

Le 0 en tête pourrait être un problème mais probablement pas. En Suède, tous les indicatifs régionaux commencent par un 0 et celui-ci est supprimé si un indicatif de pays est également composé. Mais le 0 ne fait pas vraiment partie du numéro, c'est un indicateur utilisé pour dire que j'ajoute un code régional. De même pour l'indicatif du pays, vous ajoutez 00 pour dire que vous utilisez un indicatif de comté.

Les 0 principaux ne doivent pas être stockés, ils doivent être ajoutés en cas de besoin. Si vous stockez 00 dans la base de données et que vous utilisez un serveur qui ne fonctionne qu'avec +, vous devez remplacer 00 par + pour cette application.

Donc, stockez les chiffres comme des chiffres.

0 votes

Ce n'est pas toujours une question de rapidité, il faut aussi que le système soit pratique à utiliser. L'administrateur pourrait bénéficier de l'utilisation de varchar à la place puisque nous n'avons pas besoin de faire d'arithmétique sur les nombres. Mais bien sûr, si les performances sont cruciales

3 votes

Bien sûr, cela dépend de l'application mais les nombres doivent être stockés comme des nombres :) Il n'y a aucun avantage à les garder en tant que varchar.

1 votes

@AndreasWederbrand : Les numéros de téléphone ne sont pas vraiment des numéros. (sauf si vous êtes un fan de Pythagore, alors tout est un nombre :).Vous n'avez pas besoin d'ajouter, de sustraire, de multiplier ou de trouver le contraire des "numéros" de téléphone. Je suis d'accord sur le reste (sur les 0 de tête, etc.).

15voto

Steve Rukuts Points 2708

Je suggère de stocker les nombres dans un varchar sans formatage. Vous pourrez ensuite reformater les numéros du côté client de manière appropriée. Certaines cultures préfèrent que les numéros de téléphone soient écrits différemment ; en France, ils écrivent les numéros de téléphone comme 01-22-33-44-55.

Vous pouvez également envisager de stocker un autre champ pour le pays auquel correspond le numéro de téléphone, car il peut être difficile à déterminer sur la base du numéro que vous consultez. Le Royaume-Uni utilise des numéros longs à 11 chiffres, certains pays africains des numéros longs à 7 chiffres.

Cela dit, je travaillais pour une compagnie de téléphone britannique et nous stockions les numéros de téléphone dans notre base de données selon qu'ils étaient britanniques ou internationaux. Ainsi, un numéro de téléphone britannique était le 02081234123 et un numéro international le 001800300300.

0 votes

CHAR(255) serait mieux, non ? Recommandez-vous de mettre le nombre entier dans un seul champ ? Ou de les diviser ? Si je les sépare, comment dois-je m'y prendre ?

2 votes

Eh bien, nous avons utilisé VARCHAR(20). Nous avons stocké des numéros pour chaque pays du monde et 20 était la norme dans l'entreprise. 255 semble beaucoup plus grand que ce que je recommanderais, surtout pour un format de champ statique.

0 votes

Addendum à ce qui précède : C'est à dire, si vous ne stockez pas d'extension ou d'autres informations étendues. Mais si vous stockez des informations sur l'extension, vous devriez probablement les mettre dans un autre champ de toute façon.

11voto

SurferJoe Points 86

Varchar, Ne stockez pas les caractères de séparation vous pouvez vouloir formater les numéros de téléphone différemment pour différentes utilisations. Ainsi, stockez (619) 123-4567 comme 6191234567 Je travaille avec des données d'annuaire téléphonique et j'ai trouvé que c'était la meilleure pratique.

4voto

apokryfos Points 162

Je suggérerais d'utiliser une variable pour le numéro de téléphone (car les numéros de téléphone sont connus pour avoir des zéros en tête qu'il est important de conserver) et d'avoir le numéro de téléphone dans deux champs :

Code pays et numéro de téléphone, par exemple pour 004477789787 vous pourriez stocker CountryCode=44 et le numéro de téléphone=77789787

mais cela pourrait être très spécifique à une application. Si, par exemple, vous ne stockez que des numéros américains et que vous souhaitez conserver la possibilité d'exécuter rapidement des requêtes du type "Obtenir tous les numéros d'une région spécifique", vous pouvez diviser davantage le champ du numéro de téléphone (et supprimer le champ de l'indicatif du pays, qui serait redondant).

Je ne pense pas qu'il y ait une bonne ou une mauvaise façon de procéder. Cela dépend vraiment des demandes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X