Obwohl es bereits mehrere Antworten gibt, die das Verhalten von char
korrekt beschreiben , ich denke, es muss gesagt werden, dass Sie es nicht verwenden sollten außer in drei spezifischen Situationen:
- Sie erstellen eine Datei oder einen Bericht fester Länge und weisen einem
char
einen Wert ungleich Null zu vermeidet die Notwendigkeit, einrpad()
zu codieren Ausdruck. Wenn beispielsweisefirstname
undlastname
sind beide alschar(20)
definiert , dannfirstname || lastname
ist eine kürzere Schreibweise fürrpad(firstname,20) || rpad(lastname,20)
umChuck Norris
zu erstellen . - Sie müssen zwischen der expliziten Leerzeichenfolge
''
unterscheiden undnull
. Normalerweise sind sie in Oracle dasselbe, weisen aber''
zu zu einemchar
value löst sein Verhalten zum Auffüllen mit Leerzeichen aus, währendnull
nicht, also wenn es wichtig ist, den Unterschied zu erkennen, und ich kann mir nicht wirklich einen Grund vorstellen, warum es so wäre, dann haben Sie eine Möglichkeit, das zu tun. - Ihr Code wird von einem anderen System portiert (oder muss mit diesem kompatibel sein), das aus Legacy-Gründen Leerzeichen erfordert. In diesem Fall bleiben Sie dabei und haben mein Mitgefühl.
Es gibt wirklich keinen Grund, char
zu verwenden nur weil eine bestimmte Länge festgelegt ist (z. B. ein Y/N
Flag oder ein ISO-Währungscode wie 'USD'
). Es ist nicht effizienter, es spart keinen Platz (es gibt keinen mythischen Längenindikator für ein varchar2
, gibt es nur einen Leerzeichen-Overhead für char
) und hält niemanden davon ab, kürzere Werte einzugeben. (Wenn Sie 'ZZ'
eingeben in Ihrem char(3)
Währungsspalte, wird sie einfach als 'ZZ '
gespeichert .) Es ist nicht einmal abwärtskompatibel mit einer alten Version von Oracle, die sich früher darauf verlassen hat, weil es nie eine gab.
Und die Ansteckung kann sich ausbreiten, da Sie (gemäß Best Practice) eine Variablendeklaration mit etwas wie sales.currency%type
verankern könnten . Jetzt Ihre l_sale_currency
Variable ist ein Stealth-char
die für kürzere Werte unsichtbar mit Leerzeichen aufgefüllt werden (oder ''
) und öffnet die Tür, um Fehler zu verschleiern, in denen l_sale_currency
ist nicht gleich l_refund_currency
obwohl Sie 'ZZ'
zugewiesen haben an beide.
Einige argumentieren, dass char(n)
(wobei n eine Zeichenlänge ist) gibt an, dass Werte n erwartet werden Zeichen lang, und dies ist eine Form der Selbstdokumentation. Aber wenn Sie es mit einem 3-Zeichen-Format ernst meinen (z. B. ISO-Alpha-3-Ländercodes anstelle von ISO-Alpha-2), würden Sie nicht eine Einschränkung definieren, um die Regel durchzusetzen, anstatt die Entwickler einen Blick darauf werfen zu lassen ein char(3)
Datentyp und ziehen ihre eigenen Schlüsse?
CHAR
wurde in Oracle 6 eingeführt, da bin ich mir sicher, aus Gründen der ANSI-Kompatibilität. Wahrscheinlich gibt es potenzielle Kunden, die entscheiden, welches Datenbankprodukt sie kaufen und ANSI-Kompatibilität auf ihrer Checkliste steht (oder war damals) und CHAR
with blank-padding ist im ANSI-Standard definiert, also muss Oracle es bereitstellen. Sie sollten es eigentlich nicht verwenden.