Il n'y a pas de différence, sous le capot c'est tout varlena
( tableau de longueur variable ).
Consultez cet article de Depesz: http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/
Quelques points saillants:
Pour tout résumer:
- char (n) - prend trop de place lorsqu'il s'agit de valeurs plus courtes que
n
(les remplit n
) et peut conduire à des erreurs subtiles en raison de l'ajout d'espaces de fin, de plus il est problématique de changer la limite
- varchar (n) - il est problématique de changer la limite dans l'environnement en direct (nécessite un verrouillage exclusif lors de la modification de la table)
- varchar - tout comme le texte
- texte - pour moi un gagnant - sur (n) types de données car il manque leurs problèmes, et sur varchar - parce qu'il a un nom distinct
L'article effectue des tests détaillés pour montrer que les performances des insertions et des sélections pour les 4 types de données sont similaires. Il examine également en détail d'autres moyens de limiter la longueur en cas de besoin. Les contraintes ou domaines basés sur la fonction offrent l'avantage d'une augmentation instantanée de la contrainte de longueur, et sur la base que la diminution d'une contrainte de longueur de chaîne est rare, depesz conclut que l'un d'entre eux est généralement le meilleur choix pour une limite de longueur.
En tant que « Types de caractères » dans les points de documentation sur,
varchar(n)
,char(n)
ettext
sont tous stockés de la même façon. La seule différence est que des cycles supplémentaires sont nécessaires pour vérifier la longueur, le cas échéant, et l'espace et le temps supplémentaires nécessaires si un rembourrage est nécessairechar(n)
.Cependant, lorsque vous n'avez besoin de stocker qu'un seul caractère, l'utilisation du type spécial présente un léger avantage en termes de performances
"char"
(conservez les guillemets doubles - ils font partie du nom du type). Vous obtenez un accès plus rapide au champ et il n'y a pas de surcharge pour stocker la longueur.Je viens de faire un tableau de 1 000 000
"char"
choisis au hasard dans l'alphabet minuscule. Une requête pour obtenir une distribution de fréquence (select count(*), field ... group by field
) prend environ 650 millisecondes, contre environ 760 sur les mêmes données à l'aide d'untext
champ.la source
"char"
n'est paschar
?? Est-il valable de nos jours avec PostgreSQL 11+? ... Oui: "Le type"char"
(notez les guillemets) est différent de char (1) en ce qu'il n'utilise qu'un seul octet de stockage. Il est utilisé en interne dans les catalogues système comme type d'énumération simpliste ." , guide / caractère de type de données .MISE À JOUR DES RÉFÉRENCES POUR 2016 (pg9.5 +)
Et en utilisant des benchmarks "SQL pur" (sans aucun script externe)
utiliser n'importe quel string_generator avec UTF8
repères principaux:
2.1. INSÉRER
2.2. SELECT comparant et comptant
Préparer un test spécifique (exemples)
Effectuez un test de base:
Et d'autres tests,
... Et utilisez
EXPLAIN ANALYZE
.À JOUR 2018 (p. 10)
petite modification pour ajouter les résultats de 2018 et renforcer les recommandations.
Résultats en 2016 et 2018
Mes résultats, après moyenne, sur de nombreuses machines et de nombreux tests: tout de même
(écart type statistiquement inférieur).
Recommandation
Utilisez le
text
type de données,évitez l'ancien
varchar(x)
car parfois ce n'est pas un standard, par exemple dans lesCREATE FUNCTION
clausesvarchar(x)
≠varchar(y)
.exprimer les limites (avec les mêmes
varchar
performances!) par laCHECK
clause with dans leCREATE TABLE
eg
CHECK(char_length(x)<=10)
.Avec une perte de performances négligeable dans INSERT / UPDATE, vous pouvez également contrôler les plages et la structure des chaînes,
par exemple
CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')
la source
"char"
, ce qui n'est pas le caschar
, même de nos jours avec PostgreSQL 11+. Comme le guide de / type de données caractère dit « Le type"char"
(notez les guillemets) est différent de char (1) en ce qu'il utilise un seul octet de stockage. Il est utilisé en interne dans les catalogues système comme un type d'énumération simpliste . » .Sur le manuel PostgreSQL
J'utilise habituellement du texte
Références: http://www.postgresql.org/docs/current/static/datatype-character.html
la source
À mon avis,
varchar(n)
a ses propres avantages. Oui, ils utilisent tous le même type sous-jacent et tout ça. Mais, il convient de souligner que les index dans PostgreSQL ont sa limite de taille de 2712 octets par ligne.TL; DR: Si vous utilisez du
text
type sans contrainte et avez des index sur ces colonnes, il est très possible que vous atteigniez cette limite pour certaines de vos colonnes et que vous obteniez une erreur lorsque vous essayez d'insérer des données mais en utilisantvarchar(n)
, vous pouvez l'empêcher.Quelques détails supplémentaires: Le problème ici est que PostgreSQL ne donne aucune exception lors de la création d'index pour le
text
type ouvarchar(n)
oùn
est supérieur à 2712. Cependant, il produira une erreur lorsqu'un enregistrement avec une taille compressée supérieure à 2712 sera inséré. Cela signifie que vous pouvez insérer facilement 100 000 caractères de chaîne composée de caractères répétitifs car elle sera compressée bien en dessous de 2712, mais vous ne pourrez peut-être pas insérer de chaîne de 4000 caractères car la taille compressée est supérieure à 2712 octets. En utilisantvarchar(n)
oùn
n'est pas trop supérieur à 2712, vous êtes à l'abri de ces erreurs.la source
text et varchar ont des conversions de types implicites différentes. Le plus grand impact que j'ai remarqué est la gestion des espaces de fin. Par exemple ...
retourne
true, false, true
et pastrue, true, true
comme on pourrait s'y attendre.la source
Un peu OT: Si vous utilisez Rails, le formatage standard des pages Web peut être différent. Pour les formulaires de saisie de données, les
text
cases défilent, mais les casescharacter varying
(Railsstring
) sont sur une seule ligne. Les vues affichées sont aussi longues que nécessaire.la source
Une bonne explication de http://www.sqlines.com/postgresql/datatypes/text :
la source
character varying(n)
,varchar(n)
- (les deux identiques). La valeur sera tronquée à n caractères sans déclencher d'erreur.character(n)
,char(n)
- (les deux identiques). de longueur fixe et se garnira de blancs jusqu'à la fin de la longueur.text
- Longueur illimitée.Exemple:
Nous obtenons les résultats:
la source