Existe-t-il une raison d'utiliser varchar sur les colonnes de texte d'une base de données?

36

Est varchar-ce qu'un simple résidu d'avant textest arrivé ou existe-t-il des cas d'utilisation où vous souhaiteriez utiliser un varchar? (Ou chard'ailleurs ..)

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

Izkata
la source
6
Au moins pour SQL Server , textest obsolète. Il existe également des considérations d'utilisation liées au lieu où les données sont stockées et à la manière dont elles sont accessibles.
Oded
Sur certains SGBD, il se peut que vous ne puissiez pas utiliser une colonne de texte dans une clause sort ou where. Je ne connais pas bien Postgres, mais vérifiez votre documentation.
jqa
1
Cette question de StackOverflow peut fournir des informations supplémentaires.
J0ANMM

Réponses:

32

En général

textles colonnes sont non standard et spécifiques à l'implémentation. Dans de nombreux cas, en fonction de la base de données, ils peuvent combiner une ou plusieurs des restrictions suivantes: non indexable , non interrogeable et non triable .

Dans Postgres

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

En MySQL

La textcolonne est une version spécialisée deBLOB et comporte des restrictions d’indexation.

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

Juste pour clarifier implicitement, vous ne devriez jamais utiliser TEXTcar il est propriétaire et non standard. Tous ceux SQLcontre lesquels vous écrivez ne seront pas portables et vous causeront des problèmes à l’avenir. Utilisez uniquement des types faisant partie de la norme ANSI .

  • À utiliser CHARlorsque vous savez que vous avez un nombre fixe de caractères pour chaque entrée.
  • Utilisez-le VARCHARlorsque vous avez un nombre variable de caractères pour chaque entrée.
  • Si vous avez besoin de plus d'espace de stockage que ce que vous VARCHARpouvez en fournir, utilisez CLOBun UTF-8codage ou un type de norme équivalente.
  • NE JAMAIS utiliser TEXTcar c'est non standard.

la source
1
Accepté pour non standard and implementation specificet not indexable, not searchable and not sortableque je n'ai pas réalisé. J'étais sous l'impression text était normalisée.
Izkata
1
voulez-vous dire la textnorme ASCII ou la textnorme UNICODE :-) ou l'une des autres demi-douzaines de textnormes de codage?
1
Si vous parcourez les documents de normes SQL, je ne pense pas que vous trouverez quoi textque ce soit en tant que type de caractère. Je n'ai rien vu, certains vendeurs l'appellent long char, etc., il s'agit en fait d'un BLOB auquel est associé un codage.
2
@JarrodRoberson pour être honnête, de nombreuses ressources réputées permettent de conclure (dans l'environnement Postgres) que "toujours utiliser TEXT". Si vous allez migrer vers une autre base de données, qui est à peine un briseur d'affaire, d' autant plus que vous devez considérer que postgres' illimité VARCHAR( en raison de TOAST il n'y a pas de limite de ligne comme par exemple avec MySQL) ne peut pas se traduire par illimitée VARCHARen d'autres bases de toute façon.
Kayaman
1
... et comme Postgres ne prend pas en charge CLOB , l'avant-dernier point n'est pas pris en compte. Vous ne pourrez jamais prendre en charge les remplacements directs, même si vous respectez les normes. De plus, écrire du SQL ANSI n’est pas une option viable dans le monde réel, sauf si vous écrivez du SQL jouet.
Kayaman
11

text, varcharEt charsont tous utilisés pour des raisons différentes. Il y a bien sûr des différences de mise en œuvre (quelle taille occupent-elles, etc.), mais il y a aussi des considérations d' utilisation et d' intention . Le type que vous utilisez vous dit également quelque chose sur le type de données qui y seront stockées (ou que nous utiliserions tous textpour 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-le varchar. Si vous avez peu de contrôle sur un texte volumineux, ce textserait probablement votre meilleur choix.

Système hors service
la source
3
Sooooooo, la seule vraie différence est de dupliquer la vérification des limites qui devrait probablement être dans le code du programme de toute façon?
Izkata
2
@Izkata - Il existe également des différences de mise en œuvre. Il ne s'agit pas de vérification des limites, mais du type de données . Un code postal (américain) est toujours un code à 5 chiffres. Par conséquent, l'utilisation de "caractère" entre dans la définition de cette donnée. Si ce n'est que des choses comme Bound vérifier que nous pourrions tous simplement utiliser un type de données pour tout et faire de notre vérification et de coulée côté code.
Système
6
@SystemDown Pour autant que je sache, char, varcharet textsont conçus pour stocker le même genre de données. Donc, les deux réponses ici concernent la vérification des limites. S'il y a des différences d'efficacité, quelles sont-elles? Pourquoi devrais-je utiliser varchardessus text?
Izkata
1
float et double sont également utilisés pour le même type de données, mais présentent des différences et sont utilisés différemment. En ce qui concerne les différences de mise en œuvre, je ne connais pas assez Postgres pour répondre à cette crainte.
Système
4
@SystemDown Bien que stocker des codes postaux sous la forme d'un caractère (5) puisse vous piquer si vous commencez à internationaliser. Les codes postaux du Royaume-Uni varient en longueur et 5 caractères ne suffisent presque jamais. Je ne sais pas si l'espace dans un code postal britannique est pertinent pour l'analyse, cependant.
Vatine
5

Les bases de données sont extrêmement préoccupées par les performances - rapidité et minimisation du stockage. Dans la plupart des autres parties du monde informatique, vous ne vous soucierez pas du nombre de caractères dans votre chaîne de caractères; ça pourrait être un, ça pourrait être tout le contenu d'une encyclopédie; c'est juste une ficelle. En fait, beaucoup de langages ne vous dérangent même pas, qu'il s'agisse d'une chaîne ou d'un nombre.

Mais à mesure que les ordinateurs deviennent plus rapides et gagnent en mémoire, les utilisateurs mettent plus de données dans leurs bases de données et effectuent des requêtes plus sophistiquées. Pour une base de données, le processeur et la mémoire sont tout aussi limitants qu'aujourd'hui, à l'époque de la mémoire principale de 64 Ko et des disques durs de 10 Mo (sur les ordinateurs centraux ).

Un nombre fixe d'octets est beaucoup plus facile à traiter qu'un nombre de longueur variable. 10 octets est beaucoup plus facile à traiter que 1 000 000. Votre base de données souhaite donc que vous lui donniez un indice afin de 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 difficilement, vous n'aurez pas besoin de la rapidité offerte et vous serez ennuyé par les questions inutiles. Mais si vous avez besoin de la performance, vous serez heureux de lui donner quelques indices.

Comme il est indiqué dans les autres réponses, l' utilisation charsi elle utilise toujours un certain nombre de caractères, varcharsi la longueur peut varier , mais il ne soit pas trop grand (ma conjecture est plus le traitement de DB comme un charou textselon la taille), et textsi elle pourrait être n'importe quelle longueur. Si vos tentatives SQL d'utiliser une textcolonne, il pourrait être préférable de le résumer en quelque sorte et le mettre dans une charou petite varcharcolonne aussi, puis faire where« s et order bys » sur ce point . Bien sûr, cela ne dépend que de la performance.

RalphChapin
la source