Choisir le type de colonne de ses tables MySQL

MySQL

Pour optimiser au mieux sa base de données MySQL, il faut bien choisir ses types de colonnes et leur interclassement afin d'optimiser la taille des tables et des index. Voici quelques conseils pour les types de données les plus courants.

Booléen

TINYINT UNSIGNED ou ENUM('N','Y'). La deuxième solution est plus explicite, mais moins portable car le type ENUM n'est pas disponible avec certaines bases de données (anciennes version de PostgreSQL, Oracle, IBM DB2...).

Hash MD5 ou SHA1

Généralement on utilise un CHAR(32) et un interclassement ascii_bin pour stocker le MD5 au format hexadécimal. Mais cette solution n'est pas optimale. En effet, en notation hexadécimale, chaque octet est codé sur deux caractères (0 -> 00, 128 -> 80, 255 -> FF). En utilisant un BINARY(16) pour le stocker au format binaire on gagne 16 octets par enregistrement. Pour cela, on peut en PHP, passer true en deuxième argument à la fonction md5 pour obtenir la version binaire du hash. Côté MySQL, on peut utiliser la fonction UNHEX pour transformer la chaine renvoyée par la fonction MD5 (vous pouvez trouver plus d'informations sur le sujet dans la documentation MySQL).

On peut utiliser la même technique pour un hash SHA1. Seule la taille des champs diffère (40 caractères pour la version hexadécimale, 20 pour la version binaire).

Pour plus de détail, vous pouvez consulter cet article sur le stockage d'un mot de passe dans une table MySQL.

URL

Les URL sont encodées en ASCII et peuvent être écrites en minuscules et/ou en majuscules, il faut donc choisir un interclassement ascii_general_ci (si on choisit un ascii_bin, la comparaison entre deux chaines lors d'un tri se fera par rapport aux codes des caractères et les adresses écrites en majuscules sortiront en premier). Attention, les caractères non-ASCII seront remplacés par un point d'interrogation.

D'après cette page, les URL commencent à poser des problèmes à certains navigateurs (IE pour ne pas le nommer) quand leur longueur dépasse 2 000 caractères. Il faut donc utiliser le type TEXT qui peut stocker jusqu'à 65 535 octets. L'espace occupé correspond à la longueur de l'URL auquel il faut ajouter deux octets qui servent à stocker la longueur de la chaine.

Adresses IP

Le plus souvent, on les enregistre dans une colonne de type CHAR(15) (15 octets) avec un interclassement ascii_bin.

On peut cependant gagner de l'espace en utilisant un entier (INT UNSIGNED 4 octets). Il faut alors utiliser avec les fonctions MySQL INET_ATON et INET_NTOA ou les fonctions PHP ip2long et long2ipd pour effectuer la conversion entre la notation habituelle et la valeur numérique.

Nom d'hôte

D'après la RFC 1034 :

By convention, domain names can be stored with arbitrary case, but domain name comparisons for all present domain functions are done in a case-insensitive manner, assuming an ASCII character set, and a high order zero bit.
To simplify implementations, the total number of octets that represent a domain name (i.e., the sum of all label octets and label lengths) is limited to 255.

On choisira donc un TINYTEXT en ascii_general_ci.

Adresse E-mail

Une adresse E-mail est composée de deux parties : une partie locale et un nom de domaine. Ces deux éléments sont séparés par le signe @. Comme nous venons de le voir ci-dessus, le nom de domaine est limité à 255 caractères. Pour ce qui est de la partie locale, la RFC 2821 indique que la partie locale ne doit pas dépasser 64 caractères. On aurait donc une longueur maximale égale à 64 + 1 + 255, soit 320 caractères. Le jeu de caractère utilisé est l'ASCII et bien qu'elles soient généralement écrites en minuscules, il peut arriver qu'un utilisateur les saisisse en majuscules. On doit donc utiliser un TEXT en ascii_general_ci.

Code postal

En France, c'est 5 chiffres. On peut donc utiliser un MEDIUMINT UNSIGNED qui prends 3 octets et qui peut stocker des valeurs de 0 à 16 777 215. A l'international, les codes postaux peuvent également comporter des lettres et aller jusqu'à 10 caractères (par exemple le zip code aux Etats-Unis). Un CHAR(10) en ascii_general_ci sera donc plus adapté.

Nom d'une ville

D'après Wikipédia, le plus long nom de commune de France comporte 45 caractères. Pour le reste du monde, vous devriez être tranquille avec un champ dimensionné pour accueillir 60 lettres.

Numéro de TVA intracommunautaire

En France, le numéro de TVA intracommunautaire est constitué du code ISO pour la France (FR), d'une clé informatique à 2 chiffres et du numéro SIREN de l'entreprise (à 9 chiffres). On utilisera donc un CHAR(13) en ascii_bin.

Numéro de compte international (IBAN)

D'après Wikipédia, le code IBAN comprend au maximum 34 caractères alphanumériques. On utilisera donc un CHAR(34) en ascii_bin.

Code d'identification d'une banque (BIC ou code SWIFT)

D'après Wikipédia, le code BIC est constitué de 8 ou 11 caractères alphanumériques. On utilisera donc un CHAR(11) en ascii_bin.

Si d'autres types de données vous viennent à l'esprit, n'hésitez pas à laisser un commentaire ci-dessous. On pourrait par exemple se demander quelle taille pour un prénom, un nom, un numéro de téléphone international...

Poster un nouveau commentaire

Le contenu de ce champ ne sera pas montré publiquement. If you have a Gravatar account, used to display your avatar.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. The supported tag styles are: <foo>, [foo].

Plus d'informations sur les options de formatage

CAPTCHA
La vérification ne tient pas compte des minuscules ou des majuscules.
Image CAPTCHA
Enter the characters shown in the image.