Tento dodatek vysvětluje významové rozdíly mezi CHAR
VARCHAR2
základní typy. Tyto jemné, ale důležité rozdíly přicházejí do hry, když přiřadíte, porovnat, insert, update, select nebo fetch charakter hodnoty.
tato příloha pojednává o následujících tématech:
Přiřazení Znaků Hodnot Srovnání Hodnot Znaků Vkládání Znaků Hodnoty Výběr Hodnoty Znaků
Přiřazení Hodnoty Znaků
Když jste přiřadit znak hodnotu na CHAR
proměnnou, pokud je hodnota kratší než deklarovaná délka proměnné PL/SQL prázdné-podložky hodnota deklarovaná délka. Takže informace o koncových polotovarech jsou ztraceny. V následujícím příkladu hodnota přiřazená last_name
obsahuje šest koncových mezer, nikoli pouze jednu:
last_name CHAR(10) := 'CHEN '; -- note trailing blank
Pokud je znak hodnota je delší než deklarovaná délka CHAR
proměnné PL/SQL přeruší zadání a vyvolává předdefinované výjimky VALUE_ERROR
. PL / SQL nezkracuje hodnotu ani se nepokouší oříznout koncové mezery. Například vzhledem k deklaraci
acronym CHAR(4);
následující přiřazení vyvolává VALUE_ERROR
:
acronym := 'SPCA '; -- note trailing blank
Když jste přiřadit znak hodnotu na VARCHAR2
proměnnou, pokud je hodnota kratší než deklarovaná délka variabilní, PL/SQL, ani prázdné-podložky hodnotu ani pásy koncové mezery. Hodnoty znaků jsou přiřazeny neporušené, takže nejsou ztraceny žádné informace. Pokud znak hodnota je delší než deklarovaná délka VARCHAR2
proměnné PL/SQL přeruší zadání a zvyšuje VALUE_ERROR
. PL / SQL nezkracuje hodnotu ani se nepokouší oříznout koncové mezery.
porovnání hodnot znaků
relační operátory můžete použít k porovnání hodnot znaků pro rovnost nebo nerovnost. Porovnání je založeno na sekvenci řazení použité pro znakovou sadu databáze. Jedna hodnota znaku je větší než jiná, pokud ji následuje v sekvenci řazení. Například, s ohledem na prohlášení
last_name1 VARCHAR2(10) := 'COLES';last_name2 VARCHAR2(10) := 'COLEMAN';
následující, POKUD je podmínka pravda:
IF last_name1 > last_name2 THEN ...
ANSI/ISO SQL vyžaduje, aby se dvě postavy hodnoty porovnávané mají stejnou délku. Pokud tedy obě hodnoty ve srovnání mají datový typ CHAR
, použije se sémantika polstrování prázdných polí. To znamená, že před porovnáním hodnot znaků nestejné délky, PL / SQL blank-podložky kratší hodnotu na délku delší hodnoty. Například, s ohledem na prohlášení
last_name1 CHAR(5) := 'BELLO';last_name2 CHAR(10) := 'BELLO '; -- note trailing blanks
následující IF
podmínka je pravda:
IF last_name1 = last_name2 THEN ...
Pokud je některá hodnota v porovnání se datový typ VARCHAR2
, non-prázdné-polstrování sémantika jsou používány. To znamená, že při porovnávání hodnot znaků nestejné délky neprovádí PL / SQL žádné úpravy a používá přesné délky. Například, s ohledem na prohlášení
last_name1 VARCHAR2(10) := 'DOW';last_name2 VARCHAR2(10) := 'DOW '; -- note trailing blanks
následující IF
podmínka je false:
IF last_name1 = last_name2 THEN ...
Pokud jednu hodnotu, v porovnání se datový typ VARCHAR2
a druhou hodnotu má datový typ CHAR
, non-prázdné-polstrování sémantika jsou používány. Ale pamatujte si, když jste přiřadit znak hodnotu na CHAR
proměnnou, pokud je hodnota kratší než deklarovaná délka proměnné PL/SQL prázdné-podložky hodnota deklarovaná délka. Tak, s ohledem na prohlášení
last_name1 VARCHAR2(10) := 'STAUB';last_name2 CHAR(10) := 'STAUB'; -- PL/SQL blank-pads value
následující IF
podmínka je false, protože hodnota last_name2
zahrnuje pět koncové mezery:
IF last_name1 = last_name2 THEN ...
Všechny řetězcové literály mají datový typ CHAR
. Pokud jsou tedy obě hodnoty ve srovnání literály, použije se sémantika polotovaru. Pokud je jedna hodnota doslovná, sémantika polstrování prázdných polí se používá pouze v případě, že druhá hodnota má datový typ CHAR
.
Vkládání Hodnot Znaků
Když vložíte hodnotu PL/SQL charakter proměnné do databáze Oracle sloupec, zda je hodnota prázdná-čalouněný, nebo ne, závisí na typu sloupce, ne na proměnnou typu.
Když vložíte hodnotu znaku do sloupce databáze CHAR
, Oracle neodstraňuje koncové mezery. Pokud je hodnota kratší než definovaná šířka sloupce, Oracle blank-podložky hodnotu na definovanou šířku. Výsledkem je ztráta informací o koncových polotovarech. Pokud je hodnota znaku delší než definovaná šířka sloupce, Oracle insert přeruší a vygeneruje chybu.
Když vložíte hodnotu znaku do sloupce databáze VARCHAR2
, Oracle neodstraňuje koncové mezery. Pokud je hodnota kratší než definovaná šířka sloupce, Oracle hodnotu nevyplácí. Hodnoty znaků jsou uloženy neporušené, takže nejsou ztraceny žádné informace. Pokud je hodnota znaku delší než definovaná šířka sloupce, Oracle insert přeruší a vygeneruje chybu.
Poznámka: Při aktualizaci platí stejná pravidla.
při vkládání hodnot znaků použijte funkci RTRIM
, která ořezává koncové mezery. Příklad:
DECLARE ... my_name VARCHAR2(15);BEGIN ... my_ename := 'LEE '; -- note trailing blanks INSERT INTO emp VALUES (my_empno, RTRIM(my_ename), ...); -- inserts 'LEE'END;
Výběr Hodnoty Znaků
Při výběru hodnoty z databáze Oracle sloupec v PL/SQL charakter variabilní, zda je hodnota prázdná-čalouněný, nebo ne, závisí na typu proměnné, ne na typ sloupce.
vyberte sloupec hodnoty do CHAR
proměnnou, pokud je hodnota kratší než deklarovaná délka proměnné PL/SQL prázdné-podložky hodnota deklarovaná délka. Výsledkem je ztráta informací o koncových polotovarech. Pokud je hodnota znaku delší než deklarovaná délka proměnné, PL / SQL přiřazení zruší a zvýší VALUE_ERROR
.
vyberte sloupec hodnoty do VARCHAR2
proměnnou, pokud je hodnota kratší než deklarovaná délka variabilní, PL/SQL, ani prázdné-podložky hodnotu ani pásy koncové mezery. Hodnoty znaků jsou uloženy neporušené, takže nejsou ztraceny žádné informace.
například, když vyberete prázdnou-polstrovaný CHAR
sloupce hodnoty do VARCHAR2
variabilní, koncové mezery jsou odstraněny. Pokud znak hodnota je delší než deklarovaná délka VARCHAR2
proměnné PL/SQL přeruší zadání a zvyšuje VALUE_ERROR
.
Poznámka: Při načítání platí stejná pravidla.