Réponse courte : Aucune différence pratique, de performance, ou de stockage.
Réponse longue :
Essentiellement, il n'y a pas de différence (dans MySQL) entre VARCHAR(3000)
(ou toute autre limite importante) et TEXT
. Le premier tronquera à 3000 caractères ; le second tronquera à 65535 octets. (Je fais une distinction entre les octets et les caractères parce qu'un caractère peut prendre plusieurs octets.)
Pour des limites plus petites en VARCHAR
, il y a quelques avantages par rapport à TEXT
.
- "plus petit" signifie 191, 255, 512, 767, ou 3072, etc, selon la version, le contexte, et le
JEU DE CARACTÈRES
.
- Les
INDEXes
sont limités en fonction de la taille d'une colonne pouvant être indexée. (767 or 3072 octets ; cela dépend de la version et des paramètres)
- Les tables intermédiaires créées par des
SELECTs
complexes sont gérées de deux manières différentes - MEMORY (plus rapide) ou MyISAM (plus lent). Lorsque des colonnes 'larges' sont impliquées, la méthode la plus lente est automatiquement choisie. (Des changements significatifs sont prévus dans la version 8.0 ; donc cet élément à puce est sujet à modification.)
- En rapport avec l'élément précédent, tous les datatypes
TEXT
(par opposition à VARCHAR
) passent directement à MyISAM. Autrement dit, TINYTEXT
est automatiquement moins bon pour les tables temporaires générées que l'équivalent VARCHAR
. (Mais cela amène la discussion dans une troisième direction !)
VARBINARY
est similaire à VARCHAR
; BLOB
est similaire à TEXT
.
- Une table avec plusieurs
VARCHARs
'larges' pourrait atteindre une limite de 64 Ko pour l'ensemble de la définition de la table ; passer à TEXT
est une solution simple et pratique. (Exemple : (42000) Row size too large, from an Oracle dump to a MySQL dump)
Réponse aux autres réponses
La question initiale portait sur une chose (quel datatype utiliser) ; la réponse acceptée concernait autre chose (stockage hors ligne). Cette réponse est maintenant obsolète.
Lorsque ce fil de discussion a été commencé et répondu, il n'y avait que deux "formats de lignes" dans InnoDB. Peu de temps après, deux autres formats (DYNAMIC
et COMPRESSED
) ont été introduits.
L'emplacement de stockage pour TEXT
et VARCHAR()
est basé sur la taille, pas sur le nom du datatype. Pour une discussion mise à jour sur le stockage hors ligne/en ligne des grandes colonnes de texte/blob, voir ceci.
33 votes
Un peu vieux, mais je suis venu ici parce que je suis tombé sur un problème qui m'a fait réfléchir à cela. Dans mon cas, mon formulaire front-end était limité à 2 000 caractères, mais le codage implicite dans ma méthode de stockage encodait les caractères internationaux sous forme de plusieurs caractères (ce qui peut apparemment varier de 3 à 12 par caractère). Ainsi, mes 2 000 caractères deviennent soudainement jusqu'à 24 000. Quelque chose à méditer...
3 votes
J'ai trouvé que le texte était significativement plus rapide pour de nombreuses insertions concurrentes.
1 votes
@JamesS: utf8mb4... >.< @JamesS: utf8mb4... >.<
1 votes
Voici un nouveau fil : dba.stackexchange.com/questions/210408/…
1 votes
@Rick James - La question à laquelle vous avez fait référence n'est pas du tout la même question. Veuillez noter que ce fil de discussion a été consulté 400 000 fois et vous proposez de le remplacer par quelque chose avec seulement 35 vues et votre propre réponse en tête ? Cette question est toujours parfaitement valide et les réponses ici constituent un enregistrement utile.
11 votes
@RickJames envisagez de poster une réponse mise à jour plutôt que de fermer la question
3 votes
@YvetteColomb - J'ai ajouté une réponse. J'aimerais surtout me débarrasser de la réponse acceptée car elle est désuète. Je suis venu sur le site de questions-réponses parce que quelqu'un citait des informations incorrectes en disant "754 votes positifs, donc ça doit être vrai". D'accord, j'ai également modifié la réponse approuvée. (Bien que cela semble incorrect.)
1 votes
MySQL :: MySQL 8.0 Manuel de référence :: 15.10 Formats de ligne InnoDB