Mysql
 sql >> Base de données >  >> RDS >> Mysql

Différence entre VARCHAR et TEXT dans MySQL

TL;DR

TEXT

  • taille maximale fixe de 65 535 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 (entièrement) faire partie d'un index. Il faudrait spécifier une longueur de préfixe.

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 un fixe taille maximale de 2¹⁶-1 = 65535 caractères.
VARCHAR a une variable taille max M jusqu'à M = 2¹⁶-1 .
Vous ne pouvez donc pas choisir la taille du TEXT mais vous pouvez pour un VARCHAR .

L'autre différence est que vous ne pouvez pas mettre un index (à l'exception d'un index de texte intégral) sur un TEXT colonne.
Donc, si vous voulez avoir un index sur la colonne, vous devez utiliser VARCHAR . Mais notez que la longueur d'un index est également limitée, donc si votre VARCHAR la colonne est trop longue, vous devez utiliser uniquement les premiers caractères du VARCHAR colonne dans votre index (Voir la documentation pour CREATE INDEX ).

Mais vous souhaitez également utiliser VARCHAR , si vous savez que la longueur maximale de la chaîne d'entrée possible n'est que de 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 essaie d'enregistrer le texte des trois livres "Le Seigneur des Anneaux" dans votre colonne de 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 fait plus de 65535 caractères, vous devez choisir MEDIUMTEXT ou LONGTEXT , mais attention :MEDIUMTEXT stocke les chaînes jusqu'à 16 Mo, LONGTEXT jusqu'à 4 Go. Si vous utilisez LONGTEXT et récupérez les données via PHP (au moins si vous utilisez mysqli sans store_result ), vous obtenez peut-être une erreur d'allocation de mémoire, car PHP essaie 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 devez toujours vérifiez l'entrée (est-elle trop longue ? Contient-elle un code étrange ?) avant le stocker 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.
Ex. si vous utilisez le charset latin1 et stockez le texte "Test" dans VARCHAR(30) , VARCHAR(100) et TINYTEXT , il nécessite 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 un VARCHAR(2000) ou un TEXT colonne, il faudrait également le même espace, mais, dans ce cas, ce serait 6 octets (2 octets pour stocker la longueur de la chaîne et 1 octet pour chaque caractère).

Pour plus d'informations, consultez la documentation .

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