MySQL: grand VARCHAR vs texte?

J'ai une table de messages dans MySQL qui enregistre les messages entre utilisateurs. Mis à part les ids et les types de message typiques (tous les types entiers), je dois sauvegarder le texte du message comme VARCHAR ou texte. Je mets une limite frontale de 3000 caractères, ce qui veut dire que les messages ne seront jamais insérés dans le db aussi longtemps que ça.

y a-t-il une raison d'utiliser VARCHAR(3000) ou du texte? Il y a quelque chose à propos de L'écriture de VARCHAR(3000) se sent un peu contre-intuitif. J'ai été à travers d'autres postes similaires sur le débordement de pile mais serait bon d'obtenir des vues spécifiques à ce type de stockage de message commun.

771
demandé sur Benjamin 2010-01-07 23:40:33

6 réponses

  • TEXT et BLOB est stocké hors de la table avec la table ayant juste un pointeur à l'emplacement du stockage réel.

  • VARCHAR est stocké en ligne avec le tableau. VARCHAR est plus rapide quand la taille est raisonnable, dont le compromis serait plus rapide dépend de vos données et de votre matériel, vous voudriez comparer un scénario de monde réel avec vos données.

mise à Jour Si VARCHAR ou TEXT est stocké en ligne, ou hors d'enregistrement dépend de la taille des données, la taille des colonnes, row_format, et la version de MySQL. Il ne pas dépendent de" texte "vs"varchar".

769
répondu MindStalker 2018-06-25 16:12:32

pouvez-vous prédire la durée de l'entrée de l'utilisateur?

VARCHAR (X)

Case: nom d'utilisateur, courriel, Pays, sujet, mot de passe


TEXTE

Case: messages, e-mails, commentaires, texte formaté, html, code, images, liens


medium text

affaire: gros corps json, livres courts à moyens, cordes csv


LONGTEXT

Case: manuels, programmes, années de fichiers journaux, harry potter et le gobelet de feu, la recherche scientifique logging

422
répondu Michael J. Calkins 2016-02-15 15:16:46

Juste pour clarifier la meilleure pratique:

  1. les messages en format texte devraient presque toujours être stockés sous forme de texte (ils finissent par être arbitrairement longs)

  2. attributs de la Chaîne doivent être stockées comme VARCHAR (la destination nom d'utilisateur, le sujet, etc...).

je comprends que vous avez une limite avant, ce qui est génial jusqu'à ce qu'il ne l'est pas. * grin* The le truc est de penser à la base de données comme séparée des applications qui s'y connectent. Juste parce qu'une application met une limite sur les données, ne signifie pas que les données sont intrinsèquement limitées.

Qu'est-ce que les messages eux-mêmes qui les obligent à ne jamais être plus de 3000 caractères? Si ce n'est qu'une contrainte d'application arbitraire (par exemple, pour une zone de texte ou autre), utilisez un champ TEXT à la couche de données.

212
répondu James 2014-09-22 20:00:44

Avertissement: je ne suis pas un MySQL expert ... mais c'est ma compréhension de ces questions.

je pense que le texte est stocké en dehors de la ligne mysql, alors que je pense que VARCHAR est stocké en tant que partie de la ligne. Il y a une longueur de ligne maximale pour les lignes mysql .. ainsi, vous pouvez limiter la quantité de données que vous pouvez stocker dans une rangée en utilisant le VARCHAR.

également en raison de VARCHAR faisant partie de la rangée, je soupçonne que les requêtes regardant ce champ sera légèrement plus rapide que ceux qui utilisent un morceau de texte.

31
répondu Michael Anderson 2010-01-07 20:47:02

brève réponse: aucune différence pratique, de performance ou de stockage.

longue réponse:

il n'y a essentiellement aucune différence (en MySQL) entre VARCHAR(3000) (ou toute autre limite importante) et TEXT . Le premier se tronquera à 3000 caractères ; le second se tronquera à 65535 octets . (Je fais une distinction entre octets et caractères parce qu'un personnage peut prendre plusieurs octets.)

pour les limites plus petites dans VARCHAR , il y a certains avantages par rapport à TEXT .

  • plus " signifie 191, 255, 512, 767, ou 3072, etc, en fonction de la version, le contexte et les CHARACTER SET .
  • INDEXes sont limités dans quelle colonne peut être indexée. (767 ou 3072) 1519280920" octets ; c'est la version et les paramètres dépendant)
  • les tables intermédiaires créées par le complexe SELECTs sont gérées de deux façons différentes -- la mémoire (plus rapide) ou MyISAM (plus lent). Lorsqu'il s'agit de colonnes "larges", la technique plus lente est automatiquement choisie. (Des modifications importantes sont apportées à la version 8.0; ce point est donc sujet à changement.)
  • lié à l'article précédent, Tous les types de données TEXT (par opposition à VARCHAR ) de sauter directement à MyISAM. C'est-à-dire que TINYTEXT est automatiquement pire pour les tables de température générées que l'équivalent VARCHAR . (Mais cela amène la discussion dans une troisième direction!)
  • VARBINARY est comme VARCHAR ; BLOB est comme TEXT .

réfutation à d'autres réponses

la question initiale demandait une chose (quel type de données Utiliser): réponse Réponse autre chose (entreposage hors dossier). La réponse est maintenant obsolète.

lorsque ce fil a été lancé et répondu, il n'y avait que deux "formats de ligne" dans InnoDB. Peu après, deux autres formats ( DYNAMIC et COMPRESSES ) ont été introduits.

le lieu de stockage pour TEXT et VARCHAR() est basé sur taille , et non sur nom du type de données . Pour un mise à jour discussion de on/off-record de stockage de texte de grande taille/les colonnes blob, voir ce .

8
répondu Rick James 2018-07-23 18:22:02

les réponses précédentes n'insistent pas assez sur le problème principal: même dans les requêtes très simples comme

(SELECT t2.* FROM t1, t2 WHERE t2.id = t1.id ORDER BY t1.id) 

une table temporaire peut être requise, et si un champ VARCHAR est impliqué, il est converti en un champ CHAR dans la table temporaire. Donc, si vous avez dans votre tableau disons 500 000 lignes avec un champ VARCHAR(65000) , cette colonne seule va utiliser 6.5*5*10^9 byte. De telles tables ne peuvent pas être manipulées en mémoire et sont écrits sur le disque. L'impact peut être catastrophique.

Source (avec mesures): https://nicj.net/mysql-text-vs-varchar-performance / (Ceci se réfère à la manipulation de TEXT vs VARCHAR dans"standard" (?) MyISAM storage engine. Il peut être différent dans d'autres, par exemple InnoDB.)

2
répondu Max 2018-08-23 21:06:29