PostgreSQL: la Différence entre le texte et le type varchar (character varying)
Quelle est la différence entre le text
type de données et la character varying
(varchar
) types de données?
Selon la documentation
Si le caractère variable est utilisée sans le spécificateur de longueur, le type accepte les cordes de n'importe quelle taille. Ce dernier est une extension PostgreSQL.
et
En outre, PostgreSQL fournit le type de texte, qui stocke des chaînes de n'importe quelle longueur. Bien que le type de texte n'est pas dans le standard SQL, plusieurs autres systèmes de gestion de base de données SQL ont ainsi.
Alors, quelle est la différence?
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de différence, sous le capot c'est tout
varlena
(de longueur variable tableau).Vérifier cet article de Depesz: http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/
Quelques faits saillants:
L'article ne détaillées de test pour montrer que la performance des inserts et sélectionne pour chacun des 4 types de données sont similaires. Il prend également un regard détaillé à d'autres moyens sur le fait de contraindre la longueur en cas de besoin. Fonction des contraintes ou des domaines de l'avantage de l'augmentation de la contrainte de longueur, et sur la base que la diminution d'une chaîne de caractères de longueur de contrainte est rare, depesz conclut que l'un d'eux est généralement le meilleur choix pour une limite de longueur.
Comme "Les Types De Caractères" dans la documentation souligne,
varchar(n)
,char(n)
, ettext
sont tous stockés de la même façon. La seule différence est extra cycles sont nécessaires pour vérifier la longueur, si l'un est donnée, et l'espace et le temps requis si le rembourrage est nécessaire pourchar(n)
.Toutefois, lorsque vous avez seulement besoin de stocker un caractère unique, il y a un léger avantage en termes de performances à l'aide de la type
"char"
(conserver le double-quotes — ils font partie du nom du type). Vous obtenez un accès plus rapide sur le terrain, et il n'y a pas de frais généraux pour stocker la longueur.Je viens de faire un tableau de 1 000 000 aléatoire
"char"
choisi de les minuscules de l'alphabet. 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."char"
n'est paschar
?? Il est valable dans de nos jours de PostgreSQL 11+? ... Oui: "Le type"char"
(notez les guillemets) est différent de char(1) en ce qu'il utilise uniquement un octet de stockage. Il est utilisé en interne dans les catalogues système, comme un simpliste de type énumération.", guide/type de données: caractère.La mise à JOUR des critères de référence POUR 2016 (pg9.5+)
Et à l'aide de "pur SQL" points de référence (sans script externe)
utiliser tout string_generator avec l'UTF8
principaux critères de référence:
2.1. INSÉREZ
2.2. SÉLECTIONNEZ le comparant et le comptage
Préparer les épreuves spécifiques (exemples)
Effectuer un test de base:
Et d'autres tests,
... Et l'utilisation de
EXPLAIN ANALYZE
.De NOUVEAU mis à JOUR 2018 (pg10)
peu modifier pour ajouter 2018 résultats et de renforcer les recommandations.
Résultats en 2016 et 2018
Mes résultats, après en moyenne, dans de nombreuses machines et de nombreux essais: tout de même
(statistiquement moins de tham écart-type).
Recommandation
Utilisation
text
type de données,éviter les vieux
varchar(x)
parce que parfois, il n'est pas une norme, par exemple dansCREATE FUNCTION
clausesvarchar(x)
≠varchar(y)
.express limites (avec les mêmes
varchar
performance!) par avecCHECK
clause dans leCREATE TABLE
par exemple
CHECK(char_length(x)<=10)
.Avec une perte négligeable de la performance dans l'INSERTION/mise à JOUR que vous pouvez également de plages de contrôle et la structure de la chaîne
par exemple
CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')
"char"
, qui n'est paschar
, même de nos jours, de PostgreSQL 11+. Comme le guide/type de données: caractère dit "Le type"char"
(notez les guillemets) est différent de char(1) en ce qu'il utilise uniquement un octet de stockage. Il est utilisé en interne dans les catalogues système, comme un simpliste de type énumération.".Sur PostgreSQL manuel
J'ai l'habitude d'utiliser du texte
Références: http://www.postgresql.org/docs/current/static/datatype-character.html
À 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 rappeler que les indices dans PostgreSQL a sa limite de taille de 2712 octets par ligne.TL;DR:
Si vous utilisez
text
type sans contrainte et les index sur les colonnes, il est très possible que vous atteignez cette limite, pour certaines de vos colonnes et d'erreur lorsque vous essayez d'insérer des données, mais avec l'aide devarchar(n)
, vous pouvez l'empêcher.Un peu plus de détails: Le problème ici est que PostgreSQL ne donnent pas toutes les exceptions lors de la création d'index pour
text
type ouvarchar(n)
oùn
est supérieure à 2712. Cependant, il donnera l'erreur lors d'un enregistrement avec le comprimé de taille supérieure à 2712 est tenté d'être inséré. Cela signifie que vous pouvez insérer 100.000 caractère de la chaîne est constituée par la répétition des caractères facilement car il sera compressé loin au-dessous de 2712, mais vous ne pouvez pas être en mesure d'insérer une chaîne de caractères avec 4000 caractères, car la compression de la taille est supérieure à 2712 octets. À l'aide devarchar(n)
oùn
n'est pas trop supérieure à 2712, vous êtes à l'abri de ces erreurs.texte et varchar ont différentes implicite des conversions de type. L'impact le plus important que j'ai remarqué, c'est la manipulation des espaces. Par exemple ...
retourne
true, false, true
et pastrue, true, true
comme vous vous en doutez.Un peu OT: Si vous êtes à l'aide de Rails, le standard de mise en forme de pages web peuvent être différentes. Pour la saisie des données des formulaires
text
boîtes sont défilement, maischaracter varying
(Railsstring
) cases d'une ligne. Afficher les points de vue sont aussi longtemps que nécessaire.character varying(n)
,varchar(n)
- (Le même). la valeur est tronquée à n caractères sans générer une erreur.character(n)
,char(n)
- (Le même). de longueur fixe et pad avec des espaces jusqu'à la fin de la longueur.text
- Longueur illimitée.Exemple:
Nous obtenons des résultats: