web-dev-qa-db-fra.com

type de données mysql pour le numéro de téléphone et l'adresse

Je veux entrer le numéro de téléphone dans un formulaire, avec l'indicatif de pays, le numéro de poste

create table if not exists employee(    `   
      country_code_tel   int(11),
      tel_number         int(10),
      extension          int(10),
      mobile             bigint(20)
);

Si tel_number est supérieur à 15 bits, quel type de données puis-je utiliser, je ferais mieux d'utiliser Bigint(20)?

create table address(
      address           varchar(255),  
      city              varchar(255),
      country           varchar(255),
      post_code         int(11)
);

Par exemple, si j'ai un code de pays pour le Canada, je peux utiliser +2 ou 002. Quel est le meilleur traitement?

Merci pour vos conseils.

48
Jiangong SUN

Personnellement, je n’utilise pas de type de données numérique pour stocker des numéros de téléphone ou des informations connexes.

Comment stockez-vous un nombre dit 001234567? Il finira par 1234567, perdant les zéros de tête.

Bien sûr, vous pouvez toujours le marquer à gauche, mais vous devez savoir exactement combien de chiffres le nombre doit être.

Cela ne répond pas à l'ensemble de votre message,
Seulement mes 2 centimes

67
o.k.w

En fait, vous pouvez utiliser un varchar pour un numéro de téléphone. Vous n'avez pas besoin d'un int parce que vous n'allez pas effectuer d'arithmétique sur les nombres.

46
Vincent Ramdhanie

Stockez-les sous deux champs pour les numéros de téléphone - un "numéro" et un "masque" sous la forme TinyText types qui ne nécessite pas plus de 255 éléments.

Avant de stocker les fichiers, nous analysons le numéro de téléphone pour obtenir le formatage utilisé qui crée le masque, puis nous ne stockons le nombre que de chiffres, par exemple.

Contribution: (0123) 456 7890
Nombre: 01234567890
Masque: (nnnn)_nnn_nnnn

Théoriquement, cela nous permet d'effectuer des recherches comparatives sur le champ Numéro, par exemple en obtenant tous les numéros de téléphone commençant par un indicatif régional spécifique, sans avoir à vous soucier de la façon dont il a été saisi par les utilisateurs.

31
Dan Kelly

Je stocke généralement les numéros de téléphone sous forme de BIGINT au format E164.

E164 ne commence jamais par un 0, les premiers chiffres étant l’indicatif du pays.

+441234567890
+44 (0)1234 567890
01234 567890

etc. serait stocké comme 441234567890.

24
Curon

je voudrais utiliser un varchar pour les numéros de téléphone. De cette façon, vous pouvez aussi stocker + et (), ce qui est parfois vu dans les numéros de téléphone (comme vous l'avez mentionné vous-même). et vous n'avez pas à vous soucier d'utiliser tous les bits des entiers.

7
kon

Je ne suis pas sûr que ce soit une bonne idée d'utiliser des nombres entiers. Certains nombres peuvent contenir des caractères spéciaux (# dans le cadre de l'extension, par exemple) que vous devriez être capable de gérer également. Je suggère donc d'utiliser varchars à la place.

5
nfechner

Varchar (20)/char (20) ne contient pas moins d'enregistrements de moins de 1 mil et si les performances ne sont pas un problème, sinon, j'ai constaté que pour stocker jusqu'à 100 millions de téléphones professionnels ou personnels dans le monde, int est la meilleure solution. Raison: touche plus petite -> vitesse de lecture/écriture plus rapide, le formatage peut également permettre des doublons.

1 téléphone en caractère (20) = 20 octets vs 8 octets bigint (ou 10 vs 4 octets int pour les téléphones locaux, jusqu'à 9 chiffres), moins d'entrées peuvent entrer dans le bloc d'index => more blocks => plus de recherches, voir this pour plus d’informations (écrit pour Mysql mais il devrait être vrai pour les autres bases de données relationnelles).

Voici un exemple de tables téléphoniques:

CREATE TABLE `phoneNrs` (   
    `internationalTelNr` bigint(20) unsigned NOT NULL COMMENT 'full number, no leading 00 or +, up to 19 digits, E164 format',
    `format` varchar(40) NOT NULL COMMENT 'ex: (+NN) NNN NNN NNN, optional',
    PRIMARY KEY (`internationalTelNr`)
    )
DEFAULT CHARSET=ascii
DEFAULT COLLATE=ascii_bin

ou avec traitement/division avant insertion (2 + 2 + 4 + 1 = 9 octets)

CREATE TABLE `phoneNrs` (   
    `countryPrefix` SMALLINT unsigned NOT NULL COMMENT 'countryCode with no leading 00 or +, up to 4 digits',
    `countyPrefix` SMALLINT unsigned NOT NULL COMMENT 'countyCode with no leading 0, could be missing for short number format, up to 4 digits',
    `localTelNr` int unsigned NOT NULL COMMENT 'local number, up to 9 digits',
    `localLeadingZeros` tinyint unsigned NOT NULL COMMENT 'used to reconstruct leading 0, IF(localLeadingZeros>0;LPAD(localTelNr,localLeadingZeros+LENGTH(localTelNr),'0');localTelNr)',
    PRIMARY KEY (`countryPrefix`,`countyPrefix`,`localLeadingZeros`,`localTelNr`)  -- ordered for fast inserts
) 
DEFAULT CHARSET=ascii
DEFAULT COLLATE=ascii_bin
;

Aussi "le numéro de téléphone n'est pas un numéro", à mon avis, est relatif au type de numéros de téléphone. Si nous parlons d'un répertoire téléphonique mobile interne, les chaînes conviennent, car l'utilisateur peut vouloir stocker codes de hachage GSM . Si vous stockez E164 téléphones, bigint est la meilleure option.

3
Stefan Rogin

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

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

3
00500005

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. Utiliser BIGINT vous fera économiser 3 octets par ligne sur VARCHAR (10).

Pour enregistrer "Pays + zone + numéro séparément". Vous pouvez essayer d’utiliser un VARCHAR (20), ce qui vous permet de stocker correctement les numéros de téléphone internationaux, le cas échéant.

2
Irshad Khan

varchar ou text devrait être les meilleurs types de données pour stocker les numéros de mobiles, je suppose.

1
abhinawbharat04