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
?
TEXT
c
octets d’espace disque, où c
est la longueur de la chaîne stockée.VARCHAR(M)
M
caractèresM
doit être compris entre 1 et 65535c
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éeTEXT
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 .