Nachteile des Datentyps "text" zum Speichern von Strings?

8

Gemäß der Postgres-Dokumentation unterstützen sie drei Datentypen für Zeichendaten :

%Vor%

In meiner Anwendung bin ich auf einige unangenehme Szenarien gestoßen, bei denen das Einfügen / Aktualisieren von Abfragen fehlgeschlagen ist, da der gewünschte einzufügende Text die varchar(n) oder char(n) Grenze überschritten hat.

In solchen Fällen reicht es aus, den Datentyp solcher Spalten in text zu ändern.

Meine Fragen sind:
Wenn wir den Datentyp jeder Zeichensäulenspalte auf text verallgemeinern und ändern, gibt es irgendwelche Nachteile in Bezug auf Leistung / Speicher? Wenn eine Spalte mit dem Datentyp text jedes Mal 10 oder weniger Zeichen speichert, sollte ich für text oder varchar(10) gehen?
Wenn ich für text gehe, was ist der Nachteil?

    
hemantvsn 02.12.2013, 11:12
quelle

3 Antworten

16

Im Allgemeinen gibt es keine Nachteile bei der Verwendung von text in Bezug auf Leistung / Speicher. Im Gegenteil: text ist das Optimum. Andere Arten haben mehr oder weniger relevante Nachteile. @Quassnoi und @Guffa haben dies bereits beleuchtet.

Insbesondere nie verwenden Sie char oder char(n) (Alias ​​für character / character(n) ), wenn Sie nicht wissen, was Sie tun. Dieser leer gefüllte Typ ist nur für die Kompatibilität mit altem Code und Standards vorgesehen. Es macht heutzutage sehr wenig Sinn, verschwendet Speicher und wird wahrscheinlich Probleme verursachen:

Um eine maximale Länge für eine Spalte zu erzwingen, verwenden Sie weiterhin text (oder varchar ohne Längenangabe, was im Grunde gleich ist) und nicht varchar(n) (Alias ​​für character varying / character varying(n) ). Ein CHECK constraint ist viel bequemer später ändern (ohne Tabellenumschreibung), noch mehr, wenn Ansichten, Funktionen, FK-Bedingungen usw. vom Spaltentyp abhängen.

%Vor%

Eine CHECK -Einschränkung kann auch mehr, als nur eine maximale Zeichenlänge erzwingen - alles, was Sie in einen booleschen Ausdruck einfügen können. Lesen Sie mehr:

Schließlich gibt es auch "char" (mit doppelten Anführungszeichen): Ein 1-Byte-Datentyp für einen einzelnen ASCII-Buchstaben, der als billiger interner Aufzählungstyp verwendet wird.

Ich verwende selten etwas anderes als text für Zeichendaten in Postgres.

    
Erwin Brandstetter 02.12.2013 17:26
quelle
5

Alle von Ihnen genannten Datentypen verwenden die gleiche interne Repräsentation (moderat berühmt struct varlena )

Die Datentypen CHAR und VARCHAR fügen nur Längenprüfungen hinzu und (im Fall von CHAR ) haben unterschiedliche Leerzeichenauffüll-Semantiken.

Sie können TEXT sicher verwenden, wo nichts von obiger Bedeutung für Ihre Logik wichtig ist.

    
Quassnoi 02.12.2013 11:21
quelle
2

Von der Seite, mit der Sie verknüpft haben:

  

"Unter diesen drei Typen gibt es keinen Leistungsunterschied   von erhöhtem Speicherplatz, wenn der Typ mit leerer Aufschrift verwendet wird, und a   einige zusätzliche CPU-Zyklen, um die Länge beim Speichern in einem zu überprüfen   Länge eingeschränkte Spalte. Während Charakter (n) Leistung hat   Vorteile in einigen anderen Datenbanksystemen gibt es keinen solchen Vorteil   in PostgreSQL; Tatsächlich ist Charakter (n) normalerweise der langsamste der   drei wegen seiner zusätzlichen Lagerkosten. In den meisten Situationen Text   Es sollte stattdessen ein Zeichenvariable verwendet werden. "

Es scheint keine Nachteile zu geben, den Datentyp text in Postgres zu verwenden.

Allerdings sollten Sie überlegen, ob Sie wirklich große Texte in der Datenbank speichern lassen wollen. Wenn Sie es als varchar beibehalten, aber mit einer höheren Grenze, können Sie nicht versehentlich große Datenmengen in der Datenbank speichern.

    
Guffa 02.12.2013 11:24
quelle