In diesem Anhang werden die semantischen Unterschiede zwischen den Basistypen CHAR
und VARCHAR2
erläutert. Diese subtilen, aber wichtigen Unterschiede kommen ins Spiel, wenn Sie Zeichenwerte zuweisen, vergleichen, einfügen, aktualisieren, auswählen oder abrufen.
Dieser Anhang behandelt die folgenden Themen:
Zeichenwerte zuweisen Zeichenwerte vergleichen Zeichenwerte einfügen Zeichenwerte auswählen
Zeichenwerte zuweisen
Wenn Sie einer CHAR
Variablen einen Zeichenwert zuweisen, wenn der Wert kürzer als die deklarierte Länge der Variablen ist, füllt PL/SQL den Wert leer auf die deklarierte Länge auf. Informationen zu nachfolgenden Leerzeichen gehen also verloren. Im folgenden Beispiel enthält der last_name
zugewiesene Wert sechs nachfolgende Leerzeichen, nicht nur eines:
last_name CHAR(10) := 'CHEN '; -- note trailing blank
Wenn der Zeichenwert länger ist als die deklarierte Länge der Variablen CHAR
, bricht PL/SQL die Zuweisung ab und löst die vordefinierte Ausnahme VALUE_ERROR
aus. PL / SQL schneidet den Wert weder ab noch versucht es, nachfolgende Leerzeichen zu trimmen. Bei der Deklaration
acronym CHAR(4);
ergibt sich beispielsweise die folgende Zuweisung VALUE_ERROR
:
acronym := 'SPCA '; -- note trailing blank
Wenn Sie einer VARCHAR2
Variablen einen Zeichenwert zuweisen, wenn der Wert kürzer als die deklarierte Länge der Variablen ist, füllt PL/ SQL den Wert weder leer auf noch entfernt nachfolgende Leerzeichen. Zeichenwerte werden intakt zugewiesen, sodass keine Informationen verloren gehen. Wenn der Zeichenwert länger als die deklarierte Länge der Variablen VARCHAR2
ist, bricht PL/SQL die Zuweisung ab und löst VALUE_ERROR
aus. PL / SQL schneidet den Wert weder ab noch versucht es, nachfolgende Leerzeichen zu trimmen.
Zeichenwerte vergleichen
Sie können die relationalen Operatoren verwenden, um Zeichenwerte auf Gleichheit oder Ungleichheit zu vergleichen. Vergleiche basieren auf der Sortiersequenz, die für den Datenbankzeichensatz verwendet wird. Ein Zeichenwert ist größer als ein anderer, wenn er in der Sortiersequenz darauf folgt. Bei den Deklarationen
last_name1 VARCHAR2(10) := 'COLES';last_name2 VARCHAR2(10) := 'COLEMAN';
ist beispielsweise die folgende IF-Bedingung wahr:
IF last_name1 > last_name2 THEN ...
ANSI/ ISO SQL erfordert, dass zwei zu vergleichende Zeichenwerte die gleiche Länge haben. Wenn also beide Werte in einem Vergleich den Datentyp CHAR
haben, wird die Leerauffüllungssemantik verwendet. Das heißt, bevor Zeichenwerte ungleicher Länge verglichen werden, füllt PL / SQL den kürzeren Wert leer mit der Länge des längeren Werts auf. Zum Beispiel ist angesichts der Deklarationen
last_name1 CHAR(5) := 'BELLO';last_name2 CHAR(10) := 'BELLO '; -- note trailing blanks
die folgende IF
Bedingung wahr:
IF last_name1 = last_name2 THEN ...
Wenn einer der Werte in einem Vergleich den Datentyp VARCHAR2
Semantik verwendet werden. Das heißt, wenn Zeichenwerte ungleicher Länge verglichen werden, nimmt PL / SQL keine Anpassungen vor und verwendet die genauen Längen. Zum Beispiel ist bei den Deklarationen
last_name1 VARCHAR2(10) := 'DOW';last_name2 VARCHAR2(10) := 'DOW '; -- note trailing blanks
die folgende IF
Bedingung falsch:
IF last_name1 = last_name2 THEN ...
Wenn ein Wert in einem Vergleich den Datentyp VARCHAR2
und der andere Wert den Datentyp CHAR
, Semantik ohne Leerzeichen wird verwendet. Denken Sie jedoch daran, wenn Sie einer Variablen CHAR
einen Zeichenwert zuweisen, wenn der Wert kürzer als die deklarierte Länge der Variablen ist, füllt PL / SQL den Wert leer auf die deklarierte Länge auf. Also, angesichts der Deklarationen
last_name1 VARCHAR2(10) := 'STAUB';last_name2 CHAR(10) := 'STAUB'; -- PL/SQL blank-pads value
Die folgende IF
Bedingung ist falsch, weil der Wert von last_name2
enthält fünf nachfolgende Leerzeichen:
IF last_name1 = last_name2 THEN ...
Alle String-Literale haben Datentyp CHAR
. Wenn es sich also bei beiden Werten in einem Vergleich um Literale handelt, wird die Leerauffüllungssemantik verwendet. Wenn ein Wert ein Literal ist, wird die Leerauffüllungssemantik nur verwendet, wenn der andere Wert den Datentyp CHAR
.
Zeichenwerte einfügen
Wenn Sie den Wert einer PL/SQL-Zeichenvariablen in eine Oracle-Datenbankspalte einfügen, hängt es vom Spaltentyp und nicht vom Variablentyp ab, ob der Wert leer aufgefüllt ist oder nicht.
Wenn Sie einen Zeichenwert in eine CHAR
Datenbankspalte einfügen, entfernt Oracle keine nachfolgenden Leerzeichen. Wenn der Wert kürzer als die definierte Breite der Spalte ist, füllt Oracle den Wert leer auf die definierte Breite auf. Infolgedessen gehen Informationen über nachgestellte Leerzeichen verloren. Wenn der Zeichenwert länger als die definierte Breite der Spalte ist, bricht Oracle die Einfügung ab und generiert einen Fehler.
Wenn Sie einen Zeichenwert in eine VARCHAR2
Datenbankspalte einfügen, entfernt Oracle keine nachfolgenden Leerzeichen. Wenn der Wert kürzer als die definierte Breite der Spalte ist, füllt Oracle den Wert nicht leer auf. Zeichenwerte werden intakt gespeichert, sodass keine Informationen verloren gehen. Wenn der Zeichenwert länger als die definierte Breite der Spalte ist, bricht Oracle die Einfügung ab und generiert einen Fehler.
Hinweis: Beim Aktualisieren gelten die gleichen Regeln.
Verwenden Sie beim Einfügen von Zeichenwerten die Funktion RTRIM
, die nachfolgende Leerzeichen trimmt, um sicherzustellen, dass keine nachfolgenden Leerzeichen gespeichert werden. Ein Beispiel folgt:
DECLARE ... my_name VARCHAR2(15);BEGIN ... my_ename := 'LEE '; -- note trailing blanks INSERT INTO emp VALUES (my_empno, RTRIM(my_ename), ...); -- inserts 'LEE'END;
Zeichenwerte auswählen
Wenn Sie einen Wert aus einer Oracle-Datenbankspalte in eine PL/ SQL-Zeichenvariable auswählen, hängt es vom Variablentyp und nicht vom Spaltentyp ab, ob der Wert leer aufgefüllt ist oder nicht.
Wenn Sie einen Spaltenwert in einer CHAR
Variablen auswählen, wenn der Wert kürzer als die deklarierte Länge der Variablen ist, füllt PL/SQL den Wert leer auf die deklarierte Länge auf. Infolgedessen gehen Informationen über nachgestellte Leerzeichen verloren. Wenn der Zeichenwert länger als die deklarierte Länge der Variablen ist, bricht PL/SQL die Zuweisung ab und löst VALUE_ERROR
aus.
Wenn Sie einen Spaltenwert in einer VARCHAR2
-Variablen auswählen, wenn der Wert kürzer als die deklarierte Länge der Variablen ist, füllt PL/ SQL den Wert weder leer auf noch entfernt nachfolgende Leerzeichen. Zeichenwerte werden intakt gespeichert, sodass keine Informationen verloren gehen.
Wenn Sie beispielsweise einen leer aufgefüllten CHAR
-Spaltenwert in eine VARCHAR2
-Variable einfügen, werden die nachfolgenden Leerzeichen nicht entfernt. Wenn der Zeichenwert länger als die deklarierte Länge der Variablen VARCHAR2
ist, bricht PL/SQL die Zuweisung ab und löst VALUE_ERROR
aus.
Hinweis: Beim Abrufen gelten die gleichen Regeln.