B CHAR versus VARCHAR2 Sémantika

Tento dodatek vysvětluje významové rozdíly mezi CHARVARCHAR2 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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.