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.
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
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.
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.
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
.
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.
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.
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.
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.
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.
varchar ou text devrait être les meilleurs types de données pour stocker les numéros de mobiles, je suppose.