Ich stimme allem zu , was a_horse_with_no_name sagt, und ich stimme generell Erwins Kommentar zu:
Nein, char ist minderwertig (und veraltet). text und varchar verhalten sich (fast) gleich.
Metadaten
Mit einer kleinen Ausnahme benutze ich nur dann, char()
wenn die Metadaten besagen sollen, dass diese X-Zeichen enthalten MÜSSEN . Obwohl ich weiß, dass sich char()
nur beschwert, wenn die Eingabe den Grenzwert überschreitet, werde ich mich häufig vor Unterläufen in einer CHECK
Einschränkung schützen . Beispielsweise,
CREATE TABLE foo (
x char(10) CHECK ( length(x) = 10 )
);
INSERT INTO foo VALUES (repeat('x', 9));
Ich mache das aus ein paar Gründen,
char(x)
wird bei Schemaladern manchmal als Spalte mit fester Breite gefolgert. Dies kann einen Unterschied in einer Sprache bewirken, die für Zeichenfolgen mit fester Breite optimiert ist.
- Es schafft eine Konvention, die Sinn macht und leicht durchgesetzt werden kann. Ich kann einen Schema-Loader in einer Sprache schreiben, um aus dieser Konvention Code zu generieren.
Brauchen Sie ein Beispiel, wo ich das tun darf,
- Zwei-Buchstaben-Abkürzungen, da diese Liste jedoch aufgezählt werden kann, mache ich das normalerweise mit einem
ENUM
.
- Fahrzeugidentifikationsnummern
- Modellnummern (feste Größe)
Bei Fehlern
Beachten Sie, dass einige Leute mit der Inkongruenz von Fehlermeldungen auf beiden Seiten des Limits unzufrieden sind, aber es stört mich nicht
test=# INSERT INTO foo VALUES (repeat('x', 9));
ERROR: new row for relation "foo" violates check constraint "foo_x_check"
DETAIL: Failing row contains (xxxxxxxxx ).
test=# INSERT INTO foo VALUES (repeat('x', 11));
ERROR: value too long for type character(10)
Kontrast zu varchar
Darüber hinaus denke ich, dass der obige Vorschlag wirklich gut zu einer Konvention passt, die fast immer verwendet wirdtext
. Sie fragen varchar(n)
auch nach. Ich benutze das nie . Zumindest kann ich mich nicht an das letzte Mal erinnern, als ich es benutzt habe varchar(n)
.
- Wenn eine Spezifikation ein statisches Breitenfeld hat , dass ich vertrauen, ich benutze
char(n)
,
- Ansonsten nutze ich
text
was effektiv ist varchar
(no limit)
Wenn ich eine Spezifikation mit aussagekräftigen Textschlüsseln variabler Länge und einer konstanten Maximallänge finden würde, würde ich diese ebenfalls verwenden varchar(n)
. Mir fällt jedoch nichts ein, was diesen Kriterien entspricht.
Zusätzliche Bemerkungen
Verwandte Fragen und Antworten: