web-dev-qa-db-fra.com

Y a-t-il une raison d'utiliser varchar sur des colonnes de texte dans une base de données?

varchar est-il juste un vestige d'avant text, ou existe-t-il des cas d'utilisation où vous voudriez voulez utiliser un varchar? (Ou char d'ailleurs ..)

(J'utilise Postgres et MySQL (MyISAM) quotidiennement, c'est donc ce qui m'intéresse le plus, mais les réponses pour d'autres bases de données sont bien sûr les bienvenues. ^ _-)

37
Izkata

En général

Les colonnes text sont non standard et spécifiques à l'implémentation. Dans de nombreux cas, selon la base de données, ils peuvent avoir une combinaison d'une ou plusieurs des restrictions suivantes: non indexable, non consultable et non triable.

À Postgres

Tous ces types sont enregistrés en interne en utilisant la même structure de données C. .

Dans MySQL

La colonne textest une version spécialisée de BLOB et a des restrictions sur l'indexation.

Juste ces deux exemples peuvent être extrapolés aux autres systèmes SQL RDBMS et devraient être une raison suffisante pour comprendre quand choisir un type plutôt que l'autre.

Juste pour être clair implicitement, vous ne devriez jamais utiliser TEXT car il est propriétaire et non standard. Tout SQL contre lequel vous écrivez ne sera pas portable et garantira à l'avenir des problèmes. Utilisez uniquement des types qui font partie de la norme ANSI .

  • Utilisez CHAR lorsque vous savez que vous avez un nombre fixe de caractères pour chaque entrée.
  • Utilisez VARCHAR lorsque vous avez un nombre variable de caractères pour chaque entrée.
  • Si vous avez besoin de plus d'espace de stockage que VARCHAR peut fournir, CLOB avec UTF-8 codage ou type standard équivalent.
  • [~ # ~] jamais [~ # ~] utilisez TEXT car il n'est pas standard.
33
user7519

text, varchar et char sont tous utilisés pour différentes raisons. Il y a bien sûr des différences d'implémentation (la taille qu'elles occupent, etc.), mais il y a aussi des considérations d'utilisation et intention. Le type que vous utilisez vous indique également le type de données qui y seront stockées (ou nous utiliserions tous text pour tout). Si quelque chose a une longueur fixe, nous utilisons char. S'il a une longueur variable avec une limite supérieure bien définie, utilisez varchar. Si c'est un gros morceau de texte sur lequel vous avez peu de contrôle, text serait probablement votre meilleur choix.

12
System Down

Les bases de données sont très préoccupées par les performances - la vitesse et la minimisation du stockage. Dans la plupart des autres parties du monde informatique, vous ne serez pas dérangé par le nombre de caractères dans votre chaîne de caractères; ce pourrait être un, ce pourrait être tout le contenu d'une encyclopédie; ce n'est qu'une chaîne. En fait, beaucoup de langues ne vous dérangent même pas s'il s'agit d'une chaîne ou d'un nombre.

Mais à mesure que les ordinateurs s'accélèrent et gagnent en mémoire, les gens mettent plus de données dans leurs bases de données et font des requêtes plus sophistiquées. Pour une base de données, le processeur et la mémoire sont tout aussi limités aujourd'hui qu'ils l'étaient à l'époque de la mémoire principale de 64 Ko et des disques durs de 10 Mo (sur mainframe ordinateurs).

Un nombre fixe d'octets est beaucoup plus facile à gérer qu'un nombre de longueur variable. 10 octets est beaucoup plus facile à gérer que 1 000 000. Donc, votre base de données veut que vous lui donniez un indice afin qu'elle puisse vous donner un gigaoctet de résultats à partir de terrabytes de données en microsecondes. Si vous n'utilisez pas votre base de données aussi fort, vous n'aurez pas besoin de la vitesse qu'elle offre et serez ennuyé par les questions inutiles. Mais si vous avez besoin de la performance, vous serez heureux de lui donner quelques conseils.

Comme indiqué dans les autres réponses, utilisez char si elle utilise toujours un certain nombre de caractères, varchar si la longueur peut varier mais ne devient pas trop grande (mon devinez est la plupart des DB le traitent comme un char ou text selon la taille), et text s'il peut être de n'importe quelle longueur. Si votre SQL essaie d'utiliser une colonne text, il peut être préférable de la résumer en quelque sorte et de la placer également dans une colonne char ou petite varchar, puis faites where et order by est là-dessus. Bien sûr, ce n'est que si la performance compte pour vous.

5
RalphChapin