web-dev-qa-db-fra.com

Champs MySQL communs et leurs types de données appropriés

Je suis en train de mettre en place une très petite base de données MySQL qui stocke nom, prénom, nom, email et numéro de téléphone et j'ai du mal à trouver le type de données 'parfait' pour chaque champ. Je sais qu’il n’existe pas de réponse parfaite, mais il doit exister une sorte de convention commune pour les domaines couramment utilisés tels que ceux-ci. Par exemple, j'ai déterminé qu'un numéro de téléphone américain non formaté est trop grand pour être stocké en tant qu'int non signé, il doit au moins être un bigint.

Parce que je suis sûr que d’autres personnes trouveraient probablement cela utile, je ne souhaite pas limiter ma question aux seuls domaines que j’ai mentionnés ci-dessus.

Quels types de données sont appropriés pour les champs de base de données communs? Des champs tels que le numéro de téléphone, l'adresse électronique et l'adresse?

107
Enrico

Quelqu'un va poster une réponse bien meilleure que celle-ci, mais voulait simplement faire remarquer que personnellement, je ne stockerais jamais un numéro de téléphone dans un type de champ entier, principalement pour les raisons suivantes:

  1. Vous n'avez pas besoin de faire une sorte de calcul avec elle, et
  2. Tôt ou tard, quelqu'un va essayer (de faire quelque chose du genre) de mettre des crochets autour de son indicatif régional.

En général cependant, il me semble utiliser presque exclusivement:

  • INT (11) pour tout ce qui est un ID ou fait référence à un autre ID
  • DATETIME pour les horodatages
  • VARCHAR (255) pour tout ce qui est garanti être moins de 255 caractères (titres de page, noms, etc.)
  • TEXT pour à peu près tout le reste.

Bien sûr, il y a des exceptions, mais je trouve que cela couvre la plupart des éventualités.

67
da5id

Voici quelques types de données courants que j'utilise (je ne suis cependant pas un grand pro):

| Column           | Data type     | Note
| ---------------- | ------------- | -------------------------------------
| id               | INTEGER       | AUTO_INCREMENT, UNSIGNED                                                          |  
| uuid             | CHAR(36)      | or CHAR(16) binary                                                                |  
| title            | VARCHAR(255)  |                                                                                   |  
| full name        | VARCHAR(70)   |                                                                                   |  
| gender           | TINYINT       | UNSIGNED                                                                          |  
| description      | TINYTEXT      | often may not be enough, use TEXT 
                                     instead          
| post body        | TEXT          |                                                                                   |  
| email            | VARCHAR(255)  |                                                                                   |  
| url              | VARCHAR(2083) | MySQL version < 5.0.3 - use TEXT                                                  |  
| salt             | CHAR(x)       | randomly generated string, usually of 
                                     fixed length (x)    
| digest (md5)     | CHAR(32)      |                                                                                   |  
| phone number     | VARCHAR(20)   |                                                                                   |  
| US Zip code      | CHAR(5)       | Use CHAR(10) if you store extended 
                                     codes      
| US/Canada p.code | CHAR(6)       |                                                                                   |  
| file path        | VARCHAR(255)  |                                                                                   |  
| 5-star rating    | DECIMAL(3,2)  | UNSIGNED                                                                          |  
| price            | DECIMAL(10,2) | UNSIGNED                                                                          |  
| date (creation)  | DATE/DATETIME | usually displayed as initial date of 
                                     a post                                       |  
| date (tracking)  | TIMESTAMP     | can be used for tracking changes in a 
                                     post                                        |  
| tags, categories | TINYTEXT      | comma separated values *                                                          |  
| status           | TINYINT(1)    | 1 – published, 0 – unpublished, … You 
                                     can also use ENUM for human-readable 
                                     values
| json data        | JSON          | or LONGTEXT       
35
yentsun

D'après mon expérience, les champs prénom/nom doivent contenir au moins 48 caractères. Certains noms, tels que la Malaisie ou l'Inde, sont très longs.

Les numéros de téléphone et les codes postaux que vous devriez toujours traiter comme du texte, pas des chiffres. La raison habituelle est qu’il existe des codes postaux qui commencent par 0 et que, dans certains pays, les numéros de téléphone peuvent également commencer par 0. Mais la vraie raison est qu’ils ne sont pas des numéros - Ce sont des identificateurs qui se composent de chiffres numériques (et qui ignorent des pays comme le Canada qui contiennent des lettres) leurs codes postaux). Alors stockez-les dans un champ de texte.

Dans MySQL, vous pouvez utiliser les champs VARCHAR pour ce type d'informations. Bien que cela paraisse paresseux, cela signifie que vous n'avez pas à vous préoccuper de la bonne taille minimale.

16
staticsan

Étant donné que vous allez traiter avec des données de longueur variable (noms, adresses électroniques), vous voudrez alors utiliser VARCHAR. La quantité d'espace occupée par un champ VARCHAR est [field length] + 1 octets, d’une longueur maximale de 255, je ne voudrais donc pas trop m'inquiéter d’essayer de trouver une taille parfaite. Examinez ce que vous imaginez être la plus longue, puis doublez-la et définissez-la comme limite VARCHAR. Cela dit...:

J'ai généralement défini les champs de messagerie sur VARCHAR (100) - je n'ai pas encore rencontré de problème. Noms que j'ai définis sur VARCHAR (50).

Comme les autres l'ont dit, les numéros de téléphone et les codes postaux ne sont pas des valeurs numériques, ce sont des chaînes contenant les chiffres de 0 à 9 (et parfois plus!) Et vous devez donc les traiter comme une chaîne. VARCHAR (20) devrait suffire.

Notez que si vous stockez des numéros de téléphone sous forme d'entiers, de nombreux systèmes supposeront qu'un nombre commençant par 0 est un nombre octal (base 8)! Par conséquent, le numéro de téléphone parfaitement valide "0731602412" serait placé dans votre base de données sous le numéro décimal "124192010" !!

9
nickf

Je fais à peu près la même chose et voici ce que j'ai fait.

J'ai utilisé des tables distinctes pour le nom, l'adresse, le courrier électronique et les numéros, chacune avec une colonne NameID qui est une clé étrangère pour tout, sauf la table Name, sur laquelle il s'agit de la clé en cluster principale. J'ai utilisé MainName et FirstName au lieu de LastName et FirstName pour permettre des entrées professionnelles ainsi que des entrées personnelles, mais vous n'en avez peut-être pas besoin.

La colonne NameID devient un petit entier dans toutes les tables car je suis à peu près sûr de ne pas faire plus de 32 000 entrées. Presque tout le reste est varchar (n) allant de 20 à 200, en fonction de ce que vous voulez stocker (anniversaires, commentaires, courriels, noms vraiment longs). Cela dépend vraiment du type de choses que vous stockez.

La table des nombres est où je dévie de cela. Je l'ai configuré pour avoir cinq colonnes intitulées NameID, Phone #, CountryCode, Extension et PhoneType. J'ai déjà discuté de NameID. Le numéro de téléphone est varchar (12) avec une contrainte de vérification qui ressemble à ceci: CHECK (Le numéro de téléphone ressemble à '[0-9] [0-9] [0-9] - [0-9] [0-9] [0 -9] - [0-9] [0-9] [0-9] [0-9] '). Cela garantit que seul ce que je veux est intégré à la base de données et que les données restent très cohérentes. Les codes d’extension et de pays que j’appelais nullable smallints, mais qui pourraient être varchar si vous le souhaitiez PhoneType est varchar (20) et n'est pas nullable.

J'espère que cela t'aides!

1
Thomas