B CHAR versus VARCHAR2 Semantik

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.