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 le type TEXT nous n’avons pas à fournir la longueur.

Quelles sont les différences entre VARCHAR et TEXT ?

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 maximale fixe de 2¹⁶-1 = 65535 caractères.
VARCHAR a une taille maximale variable M jusqu’à M = 2¹⁶-1 .
Vous ne pouvez donc pas choisir la taille de 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 fulltext) sur une colonne TEXT .
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 colonne VARCHAR est trop longue, vous ne devez utiliser que les premiers caractères de la colonne VARCHAR de votre index (voir la documentation de CREATE INDEX ).

Mais vous voulez aussi utiliser VARCHAR , si vous savez que la longueur maximale de la chaîne d’entrée possible est seulement 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 de sauvegarder le texte des trois livres “Lord of the Ring” dans votre colonne de numéros de téléphone, vous ne stockez que les 30 premiers caractères 🙂

Edit: Si le texte que vous souhaitez stocker dans la firebase database dépasse 65535 caractères, vous devez choisir MEDIUMTEXT ou LONGTEXT , mais MEDIUMTEXT attention: MEDIUMTEXT stocke des chaînes jusqu’à 16 Mo, LONGTEXT jusqu’à 4 Go. Si vous utilisez LONGTEXT et obtenez les données via PHP (du 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 s’assurer que toute la chaîne peut être mise en mémoire tampon. Cela se produit peut-être aussi dans d’autres langues que PHP.

Cependant, vous devriez toujours vérifier l’entrée (est-ce trop long? Contient-il du code étrange?) Avant de le stocker dans la firebase database.

Remarque: pour les deux types, l’espace disque requirejs ne dépend que de la longueur de la chaîne stockée et non de la longueur maximale.
Par exemple, 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 , il faudra également le même espace, mais dans ce cas, il s’agira 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 la documentation .

Enfin, je souhaite append une remarque, à savoir que TEXT et VARCHAR sont tous deux des types de données de longueur variable et qu’ils minimisent 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 comme CHAR . Vous pouvez en savoir plus à ce sujet ici .