2016-03-02 1 views
2

Pour autant que je sache, VARCHAR(255) fait tout ce que peut faire TINYTEXT. VARCHAR a la même taille de stockage, il fait partie de la norme ISO, il permet des valeurs par défaut autres que null. Je ne vois aucune raison de jamais utiliser TINYTEXT. Mais ça existe, alors peut-être qu'il y a une raison.Y a-t-il une raison d'utiliser TINYTEXT?

Y a-t-il une situation où TINYTEXT serait le type de données préféré pour la taille, la vitesse ou d'autres considérations?

+0

double: http://stackoverflow.com/questions/2288628/whats-the-difference-between-varchar255-and-tinytext-string-types-in-mysql ? – Varon

+1

@Varon Je ne suis pas d'accord. Aucune des réponses à cette question ne donne un oui ou un non définitif quant à savoir s'il existe ou non une bonne situation pour utiliser TINYTEXT. – rgvassar

Répondre

4

La seule situation que je peux penser où TINYTEXT pourrait être utile est si vous avez vraiment grandes lignes. Le contenu des colonnes VARCHAR compte par rapport à la taille de ligne maximale de 65 535 octets, mais les données TEXT et BLOB ne le font pas; une colonne TINYTEXT ajoute seulement 1 octet à la taille de ligne.

En fait, pour les tables InnoDB, les choses sont un peu plus compliquées. InnoDB est décrit dans les pages suivantes:

https://dev.mysql.com/doc/refman/5.7/en/innodb-physical-record.html https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format-dynamic.html https://dev.mysql.com/doc/refman/5.7/en/innodb-compression-internals.html

Pour résumer, les données mémorisées dans la partie de la table dans la limite ci-dessus pour TINYTEXT se compose d'un champ de longueur de 1 octet et un pointeur de 20 octets vers les données externes, de sorte qu'un TINYTEXT ajoute 21 octets à la longueur de ligne. Cependant, lorsqu'une valeur externe est inférieure à 40 octets, les données sont stockées en ligne dans la ligne. Donc, pour un TINYTEXT inférieur à 40 octets, le stockage est similaire à VARCHAR(255), et tout est compté par rapport à la limite de longueur de ligne.

+0

Avez-vous une référence pour la taille maximale des lignes, et est-ce spécifique au moteur? –

+0

http://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html.Le maximum pour n'importe quel moteur est de 65 535, mais certains moteurs peuvent avoir des limites plus petites. – Barmar

+0

Dans InnoDB, il faut 20 octets par colonne pour pointer vers le stockage hors enregistrement pour les grands 'VARCHARs 'et' TEXT'. –

2

TINYTEXT est essentiellement inutile. Il existe probablement pour la cohérence (4 tailles de TEXT et BLOB). TINYTEXT existait dans MySQL bien avant que VARCHAR puisse avoir plus de 255 caractères et avant qu'un caractère puisse avoir plus d'un octet.

TINYTEXT a effectivement des désavantages sur VARCHAR. Un complexe SELECT peut avoir besoin de créer une table tmp (par exemple, pour ORDER BY); la première préférence est d'utiliser MEMORY. Le repli est le moins efficace MyISAM. Toute taille TEXT et BLOB oblige à aller directement à MyISAM.

A différence est que le nombre de caractères VARCHAR est ; les tailles TEXT sont mesurées en octets. A utf8 caractère peut occuper jusqu'à 3 octets.

Ligne de fond: Ne pas utiliser TINYTEXT. (Ou TINYBLOB, qui peut être remplacé par VARBINARY(...).)