Tabelle 8-4. Zeichentypen
Name | Beschreibung |
---|---|
Zeichen variabel(n), varchar(n) | variable-Länge mit Limit |
Zeichen(n), char(n) | feste Länge, leer aufgefüllt |
text | variable unbegrenzte Länge |
Tabelle8-4 zeigt die inPostgreSQL verfügbaren Allzweck-Zeichentypen.
SQL definiert zwei primäre Zeichentypen: character varying(n) und character(n), wobei n eine positive ganze Zahl ist. Beide Typen können Zeichenketten mit einer Länge von bis zu n Zeichen (nicht Bytes) speichern. Der Versuch, eine längere Zeichenkette in einer Spalte dieser Typen zu speichern, führt zu einem Fehler, es sei denn, die überschüssigen Zeichen sind allesamt Leerzeichen; in diesem Fall wird die Zeichenkette auf die maximale Länge gekürzt. (Diese etwas bizarre Ausnahme wird vom SQL-Standard verlangt.) Wenn die zu speichernde Zeichenkette kürzer als die deklarierte Länge ist, werden Werte vom Typ character mit Leerzeichen aufgefüllt; Werte vom Typ character varying speichern einfach die kürzere Zeichenkette.
Wenn man einen Wert explizit auf charactervarying(n) oder character(n) castet, dann wird ein Wert mit Überlänge auf n Zeichen abgeschnitten, ohne einen Fehler zu verursachen. (Dies ist im SQL-Standard vorgeschrieben.)
Die Bezeichnungen varchar(n) und char(n) sind Aliase für charactervarying(n) bzw. character(n). character ohne Längenangabe ist äquivalent zucharacter(1). Wenn charactervarying ohne Längenangabe verwendet wird, akzeptiert der Typ Zeichenketten jeder Größe. Letzteres ist eine PostgreSQL-Erweiterung.
Zusätzlich stellt PostgreSQL den Typ text zur Verfügung, der Zeichenketten beliebiger Länge speichert. Obwohl der Typ text nicht im SQL-Standard enthalten ist, verfügen mehrere andere SQL-Datenbankverwaltungssysteme ebenfalls über diesen Typ.
Werte vom Typ character werden physisch mit Leerzeichen auf die angegebene Breite n aufgefüllt und auf diese Weise gespeichert und angezeigt.
Die Leerzeichen werden jedoch als semantisch unbedeutend behandelt. Nachfolgende Leerzeichen werden beim Vergleich zweier Werte vom Typ Zeichen nicht berücksichtigt und bei der Konvertierung eines Zeichenwertes in einen der anderen Stringtypen entfernt. Beachten Sie, dass abschließende Leerzeichen bei variierenden Zeichen- und Textwerten sowie bei der Verwendung von Mustervergleichen (z. B. LIKE, reguläre Ausdrücke) semantisch bedeutsam sind.
Der Speicherbedarf für eine kurze Zeichenkette (bis zu 126 Byte) beträgt 1 Byte plus die eigentliche Zeichenkette, einschließlich der Leerzeichenauffüllung im Falle von Zeichen. Längere Zeichenfolgen haben einen Overhead von 4 Byte anstelle von 1 Byte. Lange Zeichenfolgen werden vom System automatisch komprimiert, so dass der physische Bedarf auf der Festplatte geringer sein kann. Sehr lange Werte werden auch in Hintergrundtabellen gespeichert, damit sie den schnellen Zugriff auf kürzere Spaltenwerte nicht behindern.In jedem Fall beträgt die längste mögliche Zeichenkette, die gespeichert werden kann, etwa 1 GB. (Der maximale Wert, der fürn in der Datentypdeklaration zugelassen wird, ist kleiner als dieser. Es wäre nicht sinnvoll, dies zu ändern, da bei Multibyte-Zeichenkodierungen die Anzahl der Zeichen und Bytes sehr unterschiedlich sein kann. Wenn Sie lange Zeichenketten mit keiner spezifischen Obergrenze speichern wollen, verwenden Sie Text oder Zeichen, die ohne Längenangabe variieren, anstatt sich eine willkürliche Längengrenze auszudenken.)
Tipp: Es gibt keinen Leistungsunterschied zwischen diesen drei Typen, abgesehen von erhöhtem Speicherplatz bei Verwendung des Typsblank-padded und ein paar zusätzlichen CPU-Zyklen zur Überprüfung der Länge beim Speichern in einer längenbeschränkten Spalte. Während character(n) in einigen anderen Datenbanksystemen Leistungsvorteile hat, gibt es in PostgreSQL keinen solchen Vorteil; tatsächlich ist character(n) wegen der zusätzlichen Speicherkosten normalerweise der langsamste der drei Typen. In den meisten Situationen sollte stattdessen Text oder Charactervarying verwendet werden.
Informationen über die Syntax von Stringliteralen finden Sie in Abschnitt 4.1.2.1, Informationen über verfügbare Operatoren und Funktionen in Kapitel 9. Der Datenbankzeichensatz legt den Zeichensatz fest, der zum Speichern von Textwerten verwendet wird; weitere Informationen zur Zeichensatzunterstützung finden Sie in Abschnitt 22.3.
Beispiel 8-1. Verwendung der Zeichentypen
CREATE TABLE test1 (a character(4));INSERT INTO test1 VALUES ('ok');SELECT a, char_length(a) FROM test1; -- (1) a | char_length------+------------- ok | 2CREATE TABLE test2 (b varchar(5));INSERT INTO test2 VALUES ('ok');INSERT INTO test2 VALUES ('good ');INSERT INTO test2 VALUES ('too long');ERROR: value too long for type character varying(5)INSERT INTO test2 VALUES ('too long'::varchar(5)); -- explicit truncationSELECT b, char_length(b) FROM test2; b | char_length-------+------------- ok | 2 good | 5 too l | 5
char_length
wird in Abschnitt 9.4 besprochen. Es gibt zwei weitere Zeichentypen mit fester Länge in PostgreSQL, die in Tabelle8-5 aufgeführt sind. Der Typ name existiert nur für die Speicherung von Bezeichnern in den internen Systemkatalogen und ist nicht für die Verwendung durch den allgemeinen Benutzer vorgesehen. Seine Länge ist derzeit auf 64 Bytes definiert (63 verwendbare Zeichen plus Terminator), sollte aber mit der Konstante NAMEDATALEN im C-Quellcode referenziert werden. Die Länge wird zur Kompilierzeit festgelegt (und ist daher für spezielle Anwendungen anpassbar); die standardmäßige Maximallänge könnte sich in einer zukünftigen Version ändern. Der Typ “char” (man beachte die Anführungszeichen) unterscheidet sich von char(1) dadurch, dass er nur ein Byte Speicherplatz benötigt. Er wird intern in den Systemkatalogen als vereinfachter Aufzählungstyp verwendet.
Tabelle 8-5. Spezielle Zeichentypen
Name | Speichergröße | Beschreibung |
---|---|---|
“char” | 1 Byte | Einzel-Byte interner Typ |
Name | 64 Bytes | interner Typ für Objektnamen |