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 (pourM
≤ 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
.