Y a-t-il des inconvénients à utiliser le type de données "text" pour stocker des chaînes de caractères?

selon documentation Postgres , ils supportent 3 types de données pour les données de caractères:

character varying(n), varchar(n)  variable-length with limit
character(n), char(n)             fixed-length, blank padded
text                              variable unlimited length

dans mon application, j'ai rencontré peu de scénarios désagréables où les requêtes insert/update ont échoué car le texte à insérer dépassait la limite varchar(n) ou char(n) .

pour de tels cas, il suffit de changer le type de données de ces colonnes en text .

mes questions sont:

Si nous généralisons et changeons le type de données de chaque colonne de stockage de caractères en text , y a-t-il un inconvénient en termes de performance/Mémoire?

Si une colonne avec le type de données text stocke 10 caractères ou moins à chaque fois, devrais-je aller pour text ou varchar(10) ?

Si j'opte pour text , Quel est l'inconvénient?

12
demandé sur Erwin Brandstetter 2013-12-02 15:12:37

3 réponses

Généralement, il y a Non inconvénients à utiliser text en termes de performance / Mémoire. Au contraire: text est l'optimum. D'autres types ont des inconvénients plus ou moins pertinents. @Quassnoi et @Guffa ont déjà apporté quelques éclaircissements à ce sujet.

en particulier, jamais utiliser char ou char(n) (alias pour character / character(n) ), sauf si tu sais ce que tu fais. Ce type à blanc-rembourré est seulement là pour la compatibilité avec l'ancien code et les normes. Cela n'a plus de sens aujourd'hui, gaspille la mémoire et est susceptible de causer des problèmes:

pour imposer une longueur maximale sur une colonne, utilisez toujours text (ou varchar sans spécification de longueur, ce qui est fondamentalement le même) et non varchar(n) (alias for character varying / character varying(n) ). Une CHECK contrainte est beaucoup plus pratique de changer plus tard( sans réécriture de table), encore plus donc quand vues, fonctions, contraintes FK etc. dépendent du type de colonne.

ALTER TABLE tbl ADD CONSTRAINT tbl_col_len CHECK (length(col) < 100);

Un CHECK contrainte peut faire plus que de simplement appliquer une longueur maximale de caractères - tout ce que vous pouvez mettre dans une expression booléenne. Lire la suite:

enfin, il y a aussi "char" (avec double guillemets): un type de données de 1 octet pour une seule lettre ASCII utilisée comme type d'énumération interne bon marché.

j'utilise rarement autre chose que text pour les données de caractère dans Postgres.

19
répondu Erwin Brandstetter 2018-01-22 16:47:48

tous les types de données que vous mentionnez utilisent la même représentation interne (modérément célèbre struct varlena )

les types de données CHAR et VARCHAR ajoutent simplement des contrôles de longueur à cela, et (dans le cas de CHAR ), ont une sémantique de rembourrage d'espace différente.

vous pouvez utiliser TEXT en toute sécurité partout où rien de ce qui précède n'est important pour votre logique.

5
répondu Quassnoi 2013-12-02 11:21:30

de la page que vous avez liée à:

" il n'y a pas de différence de performances entre ces trois types, sauf de l'espace de stockage accru lors de l'utilisation du type blanc-rembourré, et un quelques cycles CPU supplémentaires pour vérifier la longueur lors du stockage dans un longueur de contrainte de colonne. Tout caractère(n) a la performance avantages dans certains autres systèmes de bases de données, il n'y a pas d'avantage dans PostgreSQL; en fait caractère (n) est généralement le plus lent de la trois, à cause de ses coûts de stockage. Dans la plupart des situations texte on devrait plutôt utiliser une variante ou un caractère."

il ne semble pas y avoir d'inconvénients à utiliser le type de données text dans Postgres.

cependant, vous devriez considérer si vous voulez vraiment permettre aux textes énormes d'être stockés dans la base de données. Le garder comme un varchar mais avec une limite plus élevée vous protégerait de stocker par inadvertance de grandes quantités de données dans la base de données.

2
répondu Guffa 2013-12-02 11:24:02