B Char versus Varchar2 semantyka

ten dodatek wyjaśnia różnice semantyczne między typami bazowymi CHARI VARCHAR2. Te subtelne, ale ważne różnice wchodzą w grę podczas przypisywania, porównywania, wstawiania, aktualizowania, wybierania lub pobierania wartości znaków.

niniejszy dodatek omawia następujące zagadnienia:

przypisywanie wartości znaków porównywanie wartości znaków Wstawianie wartości znaków wybieranie wartości znaków

przypisywanie wartości znaków

podczas przypisywania wartości znaków do zmiennejCHAR, jeśli wartość jest krótsza niż zadeklarowana długość zmiennej, PL / SQL blank-umieszcza wartość na zadeklarowanej długości. Tak więc informacje o ciągnących się ślepakach są tracone. W poniższym przykładzie wartość przypisana do last_name zawiera sześć końcowych spacji, a nie tylko jeden:

last_name CHAR(10) := 'CHEN '; -- note trailing blank

Jeśli wartość znaku jest dłuższa niż zadeklarowana długość zmiennej CHAR, PL/SQL przerywa przypisanie i wywołuje predefiniowany wyjątek VALUE_ERROR. PL / SQL ani nie obcina wartości, ani nie próbuje przyciąć końcowych spacji. Na przykład, biorąc pod uwagę deklarację

acronym CHAR(4);

następujące przypisanie rodzi VALUE_ERROR:

acronym := 'SPCA '; -- note trailing blank

podczas przypisywania wartości znakowej do zmiennejVARCHAR2, jeśli wartość jest krótsza niż zadeklarowana długość zmiennej, PL / SQL ani nie usuwa wartości ani nie usuwa końcowych spacji. Wartości znakowe są przypisywane w stanie nienaruszonym, więc żadne informacje nie są tracone. Jeśli wartość znaku jest dłuższa niż zadeklarowana długość zmiennejVARCHAR2, PL/SQL przerywa przypisanie i podnosiVALUE_ERROR. PL / SQL ani nie obcina wartości, ani nie próbuje przyciąć końcowych spacji.

porównywanie wartości znaków

możesz użyć operatorów relacyjnych do porównywania wartości znaków dla równości lub nierówności. Porównania są oparte na sekwencji zestawiania używanej dla zestawu znaków bazy danych. Jedna wartość znaku jest większa od drugiej, jeśli podąża za nią w sekwencji zestawiania. Na przykład, biorąc pod uwagę deklaracje

last_name1 VARCHAR2(10) := 'COLES';last_name2 VARCHAR2(10) := 'COLEMAN';

, jeśli warunek jest prawdziwy:

IF last_name1 > last_name2 THEN ...

ANSI / ISO SQL wymaga, aby dwie porównywane wartości znaków miały jednakową długość. Tak więc, jeśli obie wartości w porównaniu mają typ danych CHAR, używana jest semantyka pustego wypełnienia. Oznacza to, że przed porównaniem wartości znaków o nierównej długości, PL / SQL blank-pads krótszą wartość do długości dłuższej wartości. Na przykład, biorąc pod uwagę deklaracje

last_name1 CHAR(5) := 'BELLO';last_name2 CHAR(10) := 'BELLO '; -- note trailing blanks

następujący IF warunek jest prawdziwy:

IF last_name1 = last_name2 THEN ...

jeśli którakolwiek z wartości w porównaniu ma typ danych VARCHAR2, stosuje się semantykę non-blank-padding. Oznacza to, że podczas porównywania wartości znaków o nierównej długości, PL/SQL nie dokonuje korekt i używa dokładnych długości. Na przykład, biorąc pod uwagę deklaracje

last_name1 VARCHAR2(10) := 'DOW';last_name2 VARCHAR2(10) := 'DOW '; -- note trailing blanks

następujący IF warunek jest fałszywy:

IF last_name1 = last_name2 THEN ...

Jeśli jedna wartość w porównaniu ma typ danych VARCHAR2 I druga wartość posiada datatype CHAR, stosuje się semantykę non-blank-padding. Pamiętaj jednak, że przy przypisaniu wartości znakowej do zmiennej CHAR, jeśli wartość jest krótsza niż zadeklarowana długość zmiennej, PL/SQL blank-umieszcza wartość na zadeklarowanej długości. Tak więc, biorąc pod uwagę deklaracje

last_name1 VARCHAR2(10) := 'STAUB';last_name2 CHAR(10) := 'STAUB'; -- PL/SQL blank-pads value

następujący IF warunek jest fałszywy, ponieważ wartość last_name2 zawiera pięć końcowych spacji:

IF last_name1 = last_name2 THEN ...

wszystkie literały łańcuchów mają typ danych CHAR. Tak więc, jeśli obie wartości w porównaniu są literałami, używa się semantyki pustego wypełnienia. Jeśli jedna wartość jest literalna, semantyka pustego wypełnienia jest używana tylko wtedy, gdy druga wartość ma typ danych CHAR.

Wstawianie wartości znakowych

podczas wstawiania wartości zmiennej znakowej PL / SQL do kolumny bazy danych Oracle, to, czy wartość jest pusta, czy nie, zależy od typu kolumny, a nie od typu zmiennej.

po wstawieniu wartości znakowej do kolumny bazy danychCHAR, Oracle nie usuwa spacji końcowych. Jeśli wartość jest krótsza niż określona szerokość kolumny, Oracle blank-umieszcza wartość na określonej szerokości. W rezultacie informacja o końcowych pustych miejscach jest tracona. Jeśli wartość znaku jest dłuższa niż określona szerokość kolumny, Oracle przerywa wstawianie i generuje błąd.

po wstawieniu wartości znakowej do kolumny bazy danychVARCHAR2, Oracle nie usuwa spacji końcowych. Jeśli wartość jest krótsza niż zdefiniowana szerokość kolumny, Oracle nie spłukuje wartości. Wartości znaków są przechowywane w stanie nienaruszonym, więc żadne informacje nie są tracone. Jeśli wartość znaku jest dłuższa niż określona szerokość kolumny, Oracle przerywa wstawianie i generuje błąd.

Uwaga: te same zasady obowiązują podczas aktualizacji.

podczas wstawiania wartości znaków, aby upewnić się, że nie są przechowywane końcowe spacje, użyj funkcjiRTRIM, która przycina końcowe spacje. Przykład:

DECLARE ... my_name VARCHAR2(15);BEGIN ... my_ename := 'LEE '; -- note trailing blanks INSERT INTO emp VALUES (my_empno, RTRIM(my_ename), ...); -- inserts 'LEE'END;

wybieranie wartości znakowych

podczas wybierania wartości z kolumny bazy danych Oracle do zmiennej znakowej PL / SQL, to, czy wartość jest pusta, czy nie, zależy od typu zmiennej, a nie od typu kolumny.

Po wybraniu wartości kolumny do zmiennejCHAR, jeśli wartość jest krótsza niż zadeklarowana długość zmiennej, PL / SQL blank-umieszcza wartość na zadeklarowanej długości. W rezultacie informacja o końcowych pustych miejscach jest tracona. Jeśli wartość znaku jest dłuższa niż zadeklarowana długość zmiennej, PL/SQL przerywa przypisanie i podnosi VALUE_ERROR.

Po wybraniu wartości kolumny do zmiennejVARCHAR2, jeśli wartość jest krótsza niż zadeklarowana długość zmiennej, PL / SQL ani nie usuwa wartości ani nie usuwa końcowych spacji. Wartości znaków są przechowywane w stanie nienaruszonym, więc żadne informacje nie są tracone.

na przykład, gdy wybierzesz wartość kolumnyCHAR do zmiennejVARCHAR2, końcowe spacje nie zostaną usunięte. Jeśli wartość znaku jest dłuższa niż zadeklarowana długość zmiennejVARCHAR2, PL/SQL przerywa przypisanie i podnosiVALUE_ERROR.

Uwaga: te same zasady obowiązują podczas pobierania.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.