web-dev-qa-db-fra.com

Quel est le meilleur type de données pour un numéro de téléphone dans MySQL et que doit être le mappage de type Java?

J'utilise MySQL avec le modèle Spring JDBC pour mon application Web. Je dois enregistrer un numéro de téléphone avec seulement des chiffres (10). Je suis un peu confus sur le type de données en utilisant le type de données.

  1. Quel est le type de données préférable pour cela dans MySQL?
  2. Quel devrait être le type de données Java dans les classes Bean (POJO) pour cela?
  3. Comment puis-je valider ce type de données avec des validations/contraintes javax pour la longueur et uniquement le chiffre autorisé?
33
Vishal Zanzrukia

Cordes et VARCHAR.

  • N'essayez pas de stocker des numéros de téléphone en tant que numéros réels. cela va ruiner la mise en forme, supprimer les 0s précédents et d’autres choses indésirables.

  • Vous pouvez, si vous le souhaitez, limiter les entrées utilisateur à des valeurs numériques tout en conservant vos données persistantes sauvegardées sous forme de caractères/chaînes et non de chiffres.

  • Soyez conscient du monde dans son ensemble et de la différence de longueur et de format de leurs nombres avant d'essayer d'implémenter des restrictions de longueur, des validations ou des masques (par exemple, XXX-XXXX-XX).

  • Les caractères non numériques peuvent être valides dans les numéros de téléphone. Un exemple typique étant + en remplacement de 00 au début d'un numéro international.

Edité à partir de la conversation dans les commentaires: 

  • Il est l’une des erreurs les plus importantes de l’interface utilisateur que les numéros de téléphone aient quelque chose à voir avec les chiffres. Il est beaucoup mieux de penser à les traiter et de les traiter comme des adresses, car ils sont plus proches de ce qu’ils sont réellement et représentent plutôt que des "numéros" de téléphone.
41
indivisible

Dans MySQL -> INT (10) ne signifie pas un nombre à 10 chiffres, mais un entier avec une largeur d’affichage de 10 chiffres. La valeur maximale d'une INT dans MySQL est 2147483647 (ou 4294967295 si non signé).

Vous pouvez utiliser un BIGINT au lieu de INT pour le stocker sous forme numérique. En utilisant BIGINT vous fera économiser 3 octets par ligne sur VARCHAR (10).

Si vous souhaitez enregistrer "Pays + zone + numéro séparément". Essayez d’utiliser un VARCHAR (20). Cela vous permet de stocker correctement les numéros de téléphone internationaux, le cas échéant.

11
Irshad Khan

Pensez à utiliser le format E.164 . Pour une assistance internationale complète, vous avez besoin d’un VARCHAR de 15 chiffres.

Voir Recommandation Twilio pour plus d'informations sur la localisation des numéros de téléphone.

4
00500005
  1. varchar
  2. Chaîne

  3. Une regex simple. Voir: Comment vérifier si une chaîne ne contient que des chiffres en Java . Utilisez javax.constraints.Pattern.

2
GreyBeardedGeek

vous pouvez utiliser var-char, String et int, cela dépend de vous, si vous utilisez uniquement le code pays avec le numéro de portable que vous pouvez utiliser int, si vous utilisez un format spécial pour le nombre que vous utilisez le type String ou var-char, si vous le souhaitez. utilisez var-char puis doit masquer la taille du nombre et restreindre l'accès à l'utilisateur.

1
damon

VARCHAR avec probablement 15 à 20 longueurs serait suffisant et constituerait la meilleure option pour la base de données. Étant donné que vous auriez probablement besoin de divers traits d'union et signes plus avec vos numéros de téléphone. 

0
NcDreamy

Dans MySQL: BIGINT . En Java: Long.

Tout est basé sur vos besoins. Si vous développez une application à petite échelle et que vous ne couvrez qu'une région spécifique (public cible), vous pouvez choisir BIGINT pour stocker uniquement des nombres, car VARCHAR consomme plus d'octets que BIGINT (l'utilisation optimale de la mémoire importe peu). mais si vous développez une application à grande échelle et cible des utilisateurs mondiaux et que vous disposez de suffisamment de capacités de base de données pour stocker des données, vous pouvez certainement choisir VARCHAR. 

0
bala raja