web-dev-qa-db-fra.com

Différence entre VARCHAR et TEXT dans mysql

Lorsque nous créons une table dans mysql avec une colonne VARCHAR, nous devons en définir la longueur. Mais pour TEXT, nous n'avons pas à fournir la longueur.

Quelles sont les différences entre VARCHAR et TEXT?

243
user3840485

TL; DR

TEXT

  • taille maximale fixe de 65535 caractères (vous ne pouvez pas limiter la taille maximale)
  • prend 2 + c octets d’espace disque, où c est la longueur de la chaîne stockée.
  • ne peut pas faire partie d'un index

VARCHAR(M)

  • taille maximale variable de M caractères
  • M doit être compris entre 1 et 65535
  • prend 1 + c octets (pour M ≤ 255) ou 2 + c (pour 256 ≤ M ≤ 65535) octets d’espace disque où c est la longueur de la chaîne stockée
  • peut faire partie d'un index

Plus de détails

TEXT a une taille fixe maximale de _2¹⁶-1 = 65535_ caractères.
VARCHAR a une variable taille maximale M jusqu'à _M = 2¹⁶-1_.
Vous ne pouvez donc pas choisir la taille de TEXT mais vous pouvez le faire pour un VARCHAR.

L'autre différence est que vous ne pouvez pas mettre d'index (à l'exception d'un index de texte intégral) sur une colonne TEXT.
Donc, si vous voulez avoir un index sur la colonne, vous devez utiliser VARCHAR. Notez toutefois que la longueur d’un index est également limitée. Ainsi, si votre colonne VARCHAR est trop longue, vous devez n’utiliser que les premiers caractères de la colonne VARCHAR de votre index (voir la documentation de CREATE INDEX ).

Mais vous souhaitez également utiliser VARCHAR, si vous savez que la longueur maximale de la chaîne d'entrée possible est uniquement M, par exemple. un numéro de téléphone ou un nom ou quelque chose comme ça. Ensuite, vous pouvez utiliser VARCHAR(30) au lieu de TINYTEXT ou TEXT et si quelqu'un tente de sauvegarder le texte des trois livres "Le Seigneur de l'anneau" dans la colonne de votre numéro de téléphone, vous ne stockez que les 30 premiers caractères :)

Modifier: Si le texte que vous souhaitez stocker dans la base de données dépasse 65535 caractères, vous devez choisir MEDIUMTEXT ou LONGTEXT, mais faites attention: MEDIUMTEXT magasins chaînes jusqu'à 16 Mo, LONGTEXT jusqu'à 4 Go. Si vous utilisez LONGTEXT et récupérez les données via PHP (du moins si vous utilisez mysqli sans _store_result_), vous risquez d'obtenir une erreur d'allocation de mémoire, car PHP tente d'allouer 4 Go de mémoire pour être sûr que toute la chaîne peut être mise en mémoire tampon. Cela se produit peut-être aussi dans d'autres langages que PHP.

Cependant, vous devriez toujours vérifier l’entrée (est-ce trop long? Contient-il un code étrange?) avant en le stockant dans la base de données.

Remarque: pour les deux types, l’espace disque requis dépend uniquement de la longueur de la chaîne stockée et non de la longueur maximale.
Eg si vous utilisez le jeu de caractères latin1 et stockez le texte "Test" dans VARCHAR(30), VARCHAR(100) et TINYTEXT, il faut toujours 5 octets (1 octet pour stocker la longueur). de la chaîne et 1 octet pour chaque caractère). Si vous stockez le même texte dans une colonne VARCHAR(2000) ou TEXT, le même espace serait nécessaire, mais dans ce cas, il s'agirait de 6 octets (2 octets pour stocker la longueur de la chaîne et 1 octet pour chaque caractère).

Pour plus d'informations, consultez le documentation .

Enfin, je souhaite ajouter une remarque indiquant que les types TEXT et VARCHAR sont des types de données de longueur variable et qu'ils minimisent donc très probablement l'espace dont vous avez besoin pour stocker les données. Mais cela vient avec un compromis pour la performance. Si vous avez besoin de meilleures performances, vous devez utiliser un type de longueur fixe tel que CHAR. Vous pouvez en lire plus à ce sujet ici .

449
AbcAeffchen