B CHAR vs. VARCHAR2 semantiikka

Tämä liite selittää semanttiset erot CHAR ja VARCHAR2 perustyyppien välillä. Nämä hienovaraiset mutta tärkeät erot tulevat peliin, kun määrität, vertailet, lisäät, päivität, valitset tai noudat merkkiarvoja.

tässä liitteessä käsitellään seuraavia aiheita:

Merkkiarvojen määrittäminen vertaamalla Merkkiarvoja lisäämällä Merkkiarvoja valitsemalla merkkiarvot

merkkiarvot

kun merkkiarvo annetaan CHAR muuttuja, jos arvo on lyhyempi kuin muuttujan ilmoitettu pituus, PL / SQL Nollaa-pads arvo ilmoitetulle pituudelle. Eli tiedot paukkupakkasten perään menemisestä ovat hukassa. Seuraavassa esimerkissä last_name annettu arvo sisältää kuusi perään merkittyä aihiota, ei vain yhtä:

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

Jos merkkiarvo on pitempi kuin CHAR muuttuja, PL/SQL keskeyttää tehtävän ja nostaa ennalta määritellyn poikkeuksen VALUE_ERROR. PL/SQL ei katkaise arvoa eikä yritä leikata perään tyhjiä. Esimerkiksi julistuksen

acronym CHAR(4);

perusteella seuraava toimeksianto nostaa VALUE_ERROR:

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

kun VARCHAR2 muuttuja antaa merkin arvon, jos arvo on lyhyempi kuin muuttujan ilmoitettu pituus, PL / SQL ei Nollaa arvoa eikä liuskoja perään aihioita. Merkkiarvot on määritetty ehjinä, joten mitään tietoa ei häviä. Jos merkkiarvo on pidempi kuin VARCHAR2 muuttuja, PL/SQL keskeyttää ja korottaa VALUE_ERROR. PL/SQL ei katkaise arvoa eikä yritä leikata perään tyhjiä.

vertaamalla Merkkiarvoja

relaatiooperaattoreilla voidaan verrata merkkiarvoja tasa-arvon tai epäyhtälön suhteen. Vertailut perustuvat tietokannan merkistölle käytettävään kokoamisjärjestykseen. Yksi merkkiarvo on suurempi kuin toinen, jos se seuraa sitä kokoamisjärjestyksessä. Esimerkiksi lausekkeiden

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

seuraava jos ehto on tosi:

IF last_name1 > last_name2 THEN ...

ANSI / ISO SQL edellyttää, että kahdella vertaillulla merkkiarvolla on yhtä pitkät pituudet. Jos siis molemmilla vertailun arvoilla on datatyyppi CHAR, käytetään nollapehmustesemantiikkaa. Toisin sanoen ennen kuin vertaamme eripituisia merkkiarvoja, PL/SQL blank-pads lyhyempi arvo pitemmän arvon pituuteen. Esimerkiksi ilmoitusten

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

seuraava IF ehto pitää paikkansa:

IF last_name1 = last_name2 THEN ...

Jos jommallakummalla vertailun arvolla on datatyyppi VARCHAR2, ei-tyhjä-täyte semantiikkaa käytetään. Toisin sanoen verrattaessa eripituisia merkkiarvoja PL / SQL ei tee muutoksia ja käyttää tarkkoja pituuksia. Esimerkiksi ilmoitusten

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

seuraava IF ehto on virheellinen:

IF last_name1 = last_name2 THEN ...

Jos yhdellä vertailussa olevalla arvolla on datatyyppi VARCHAR2 ja toisella arvolla on datatyyppi CHAR, käytetään ei-tyhjänpäiväistä semantiikkaa. Mutta, muista, kun annat merkin arvon CHAR muuttuja, jos arvo on lyhyempi kuin ilmoitettu pituus muuttuja, PL/SQL tyhjä-pads arvo ilmoitettu pituus. Näin ollen, ottaen huomioon julistukset

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

seuraava IF ehto on epätosi, koska last_name2 sisältää viisi perään laitettavaa aihiota:

IF last_name1 = last_name2 THEN ...

Kaikki string literaleilla on datatyyppi CHAR. Jos siis molemmat arvot vertailussa ovat literaaleja, käytetään aihiotäytteistä semantiikkaa. Jos toinen arvo on kirjaimellinen, käytetään tyhjänpäiväistä semantiikkaa vain, jos toisella arvolla on datatyyppi CHAR.

Merkkiarvojen lisääminen

kun PL / SQL-merkkimuuttujan arvo lisätään Oraclen tietokannan sarakkeeseen, riippuu saraketyypistä, ei muuttujan tyypistä.

kun merkistön arvo lisätään CHAR tietokanta-sarakkeeseen, Oracle ei poista perään tyhjiä kohtia. Jos arvo on lyhyempi kuin sarakkeen määritelty leveys, Oracle Nollaa arvon määritetylle leveydelle. Tämän seurauksena tieto paukkupakkasten perään menemisestä katoaa. Jos merkkiarvo on pidempi kuin sarakkeen määritelty leveys, Oracle keskeyttää insertin ja tuottaa virheen.

kun lisätään merkkiarvo VARCHAR2 tietokanta-sarakkeeseen, Oracle ei riisu perään aihioita. Jos arvo on lyhyempi kuin sarakkeen määritelty leveys, Oracle ei tyhjennä arvoa. Merkkiarvot tallennetaan ehjinä, joten mitään tietoa ei häviä. Jos merkkiarvo on pidempi kuin sarakkeen määritelty leveys, Oracle keskeyttää insertin ja tuottaa virheen.

Huomautus: päivityksessä pätevät samat säännöt.

merkistöarvoja asetettaessa, jotta varmistutaan siitä, ettei jälkiaukkoja tallenneta, käytetään funktiota RTRIM, joka trimmaa jälkiaakkoset. Seuraavassa esimerkki:

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

Merkkiarvojen valitseminen

kun valitset arvon Oraclen tietokantasarakkeesta PL/SQL-merkkimuuttujaksi, riippuu muuttujan tyypistä, ei saraketyypistä.

kun valitset sarakkeen arvon CHAR muuttuja, jos arvo on lyhyempi kuin muuttujan ilmoitettu pituus, PL / SQL tyhjentää arvon ilmoitetulle pituudelle. Tämän seurauksena tieto paukkupakkasten perään menemisestä katoaa. Jos merkkiarvo on pidempi kuin muuttujan ilmoitettu pituus, PL/SQL keskeyttää ja korottaa VALUE_ERROR.

kun valitset sarakearvon VARCHAR2 muuttuja, jos arvo on lyhyempi kuin muuttujan ilmoitettu pituus, PL / SQL ei Nollaa arvoa eikä liuskoja perään aihioita. Merkkiarvot tallennetaan ehjinä, joten mitään tietoa ei häviä.

esimerkiksi, kun valitaan tyhjänpäiväinen CHAR sarakearvo VARCHAR2 muuttuja, jälkiaukkoja ei riisuta. Jos merkkiarvo on pidempi kuin VARCHAR2 muuttuja, PL/SQL keskeyttää ja korottaa VALUE_ERROR.

Huom: samat säännöt pätevät noudettaessa.

Vastaa

Sähköpostiosoitettasi ei julkaista.