Es gibt keinen Unterschied, unter der Haube ist alles varlena
( Array mit variabler Länge ).
Überprüfen Sie diesen Artikel von Depesz: http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/
Ein paar Highlights:
Um alles zusammenzufassen:
- char (n) - nimmt zu viel Platz in Anspruch, wenn Werte behandelt werden, die kürzer sind als
n
(füllt sie auf n
), und kann aufgrund des Hinzufügens von nachgestellten Leerzeichen zu subtilen Fehlern führen. Außerdem ist es problematisch, den Grenzwert zu ändern
- varchar (n) - Es ist problematisch, das Limit in der Live-Umgebung zu ändern (erfordert eine exklusive Sperre beim Ändern der Tabelle).
- varchar - genau wie Text
- Text - für mich ein Gewinner - über (n) Datentypen, weil es keine Probleme gibt, und über varchar - weil es einen eindeutigen Namen hat
Der Artikel führt detaillierte Tests durch, um zu zeigen, dass die Leistung von Einfügungen und Auswahlen für alle 4 Datentypen ähnlich ist. Außerdem werden alternative Möglichkeiten zum Einschränken der Länge bei Bedarf detailliert beschrieben. Funktionsbasierte Einschränkungen oder Domänen bieten den Vorteil einer sofortigen Erhöhung der Längenbeschränkung. Aufgrund der Tatsache, dass das Verringern einer Zeichenfolgenlängenbeschränkung selten ist, kommt depesz zu dem Schluss, dass eine davon normalerweise die beste Wahl für eine Längenbeschränkung ist.
Als „ Zeichentypen “ in der Dokumentation weist darauf hin,
varchar(n)
,char(n)
, undtext
sind alle auf die gleiche Weise gespeichert. Der einzige Unterschied besteht darin, dass zusätzliche Zyklen erforderlich sind, um die Länge zu überprüfen, falls eine angegeben ist, und den zusätzlichen Platz und die zusätzliche Zeit, die erforderlich sind, wenn eine Polsterung erforderlich istchar(n)
.Wenn Sie jedoch nur ein einzelnes Zeichen speichern müssen, bietet die Verwendung des speziellen Typs einen geringfügigen Leistungsvorteil
"char"
(behalten Sie die doppelten Anführungszeichen bei - sie sind Teil des Typnamens). Sie erhalten einen schnelleren Zugriff auf das Feld und es gibt keinen Overhead zum Speichern der Länge.Ich habe gerade eine Tabelle mit 1.000.000 Zufällen erstellt,
"char"
die aus dem Kleinbuchstaben ausgewählt wurden. Eine Abfrage zum Abrufen einer Häufigkeitsverteilung (select count(*), field ... group by field
) dauert ungefähr 650 Millisekunden, gegenüber ungefähr 760 für dieselben Daten unter Verwendung einestext
Felds.quelle
"char"
ist nichtchar
? Es ist heutzutage gültig für PostgreSQL 11+? ... Ja: "Der Typ"char"
(beachten Sie die Anführungszeichen) unterscheidet sich von char (1) darin, dass nur ein Byte Speicher verwendet wird. Er wird intern in den Systemkatalogen als vereinfachter Aufzählungstyp verwendet ." , Leitfaden / Datentyp-Zeichen .AKTUALISIERUNG DER BENCHMARKS FÜR 2016 (S. 9,5 +)
Und mit "Pure SQL" -Benchmarks (ohne externes Skript)
Verwenden Sie einen beliebigen string_generator mit UTF8
Hauptbenchmarks:
2.1. EINFÜGEN
2.2. SELECT Vergleichen und Zählen
Spezifischen Test vorbereiten (Beispiele)
Führen Sie einen Basistest durch:
Und andere Tests,
... und verwenden
EXPLAIN ANALYZE
.WIEDER AKTUALISIERT 2018 (S. 10)
wenig bearbeiten, um die Ergebnisse von 2018 hinzuzufügen und Empfehlungen zu verstärken.
Ergebnisse in 2016 und 2018
Meine Ergebnisse nach dem Durchschnitt in vielen Maschinen und vielen Tests: alle gleich
(statistisch weniger als die Standardabweichung).
Empfehlung
Verwenden Sie den
text
Datentyp,vermeiden Sie alte,
varchar(x)
da dies manchmal kein Standard ist, z . B. in denCREATE FUNCTION
Abschnittenvarchar(x)
≠varchar(y)
.ausdrückliche Grenzen (bei gleicher
varchar
Leistung!) durch mitCHECK
Klausel in derCREATE TABLE
z
CHECK(char_length(x)<=10)
.Mit einem vernachlässigbaren Leistungsverlust in INSERT / UPDATE können Sie auch Bereiche und String-Strukturen steuern,
z
CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')
quelle
"char"
, die nicht istchar
, auch in heute von PostgreSQL 11+. Wie das Handbuch / Datentyp-Zeichen sagt "Der Typ"char"
(beachten Sie die Anführungszeichen) unterscheidet sich von char (1) darin, dass er nur ein Byte Speicher verwendet. Er wird intern in den Systemkatalogen als vereinfachter Aufzählungstyp verwendet ." .Im PostgreSQL-Handbuch
Ich benutze normalerweise Text
Referenzen: http://www.postgresql.org/docs/current/static/datatype-character.html
quelle
Meiner Meinung nach
varchar(n)
hat es seine eigenen Vorteile. Ja, sie alle verwenden denselben zugrunde liegenden Typ und all das. Es sollte jedoch darauf hingewiesen werden, dass Indizes in PostgreSQL eine Größenbeschränkung von 2712 Bytes pro Zeile haben.TL; DR: Wenn Sie einen
text
Typ ohne Einschränkung verwenden und Indizes für diese Spalten haben, ist es sehr wahrscheinlich, dass Sie diese Grenze für einige Ihrer Spalten erreichen und beim Versuch, Daten einzufügen, eine Fehlermeldung erhalten. Mit der Verwendungvarchar(n)
können Sie dies jedoch verhindern.Weitere Details: Das Problem hierbei ist, dass PostgreSQL beim Erstellen von Indizes für den
text
Typ odervarchar(n)
bei einemn
Wert größer als 2712 keine Ausnahmen angibt. Es wird jedoch ein Fehler ausgegeben, wenn versucht wird, einen Datensatz mit einer komprimierten Größe von mehr als 2712 einzufügen. Dies bedeutet, dass Sie leicht 100.000 Zeichen Zeichenfolgen einfügen können, die aus sich wiederholenden Zeichen bestehen, da diese weit unter 2712 komprimiert werden. Sie können jedoch möglicherweise keine Zeichenfolgen mit 4000 Zeichen einfügen, da die komprimierte Größe größer als 2712 Byte ist. Wenn Sie verwenden,varchar(n)
won
nicht zu viel größer als 2712 ist, sind Sie vor diesen Fehlern sicher.quelle
Text und Varchar haben unterschiedliche implizite Typkonvertierungen. Die größte Auswirkung, die mir aufgefallen ist, ist der Umgang mit nachgestellten Leerzeichen. Beispielsweise ...
kehrt zurück
true, false, true
und nichttrue, true, true
wie erwartet.quelle
Etwas OT: Wenn Sie Rails verwenden, kann die Standardformatierung von Webseiten unterschiedlich sein. Bei Dateneingabeformularen können
text
Felder gescrollt werden,character varying
(Schienen-string
) Felder sind jedoch einzeilig. Showansichten sind so lang wie nötig.quelle
Eine gute Erklärung von http://www.sqlines.com/postgresql/datatypes/text :
quelle
character varying(n)
,varchar(n)
- (beide gleich). Der Wert wird auf n Zeichen gekürzt, ohne dass ein Fehler auftritt.character(n)
,char(n)
- (beide gleich). feste Länge und wird bis zum Ende der Länge mit Leerzeichen aufgefüllt.text
- Unbegrenzte Länge.Beispiel:
Wir bekommen die Ergebnisse:
quelle