B CHAR versus VARCHAR2 Semantikk

dette tillegget forklarer de semantiske forskjellene mellom CHAR og VARCHAR2 basetyper. Disse subtile, men viktige forskjellene spiller inn når du tilordner, sammenligner, setter inn, oppdaterer, velger eller henter tegnverdier.

dette vedlegget omhandler følgende emner:

Tilordne Tegnverdier Sammenligne Tegnverdier Sette Inn Tegnverdier Velge Tegnverdier

Tilordne Tegnverdier

når du tilordner en tegnverdi til en CHAR variabel, hvis verdien er kortere enn den deklarerte lengden av variabelen, pl/SQL blank-pads verdien til den deklarerte lengden. Så, informasjon om etterfølgende emner går tapt. I følgende eksempel inneholder verdien som er tilordnet last_name seks etterfølgende mellomrom, ikke bare en:

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

hvis tegnverdien er lengre enn den deklarerte lengden påCHAR variabelen, avbryter PL / SQL tildelingen og hever det forhåndsdefinerte unntaket VALUE_ERROR. PL / SQL verken avkorter verdien eller prøver å trimme etterfølgende emner. For eksempel, gitt erklæringen

acronym CHAR(4);

følgende oppgave reiser VALUE_ERROR:

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

når du tilordner en tegnverdi til enVARCHAR2 variabel, HVIS verdien er kortere enn den deklarerte lengden av variabelen, PL / SQL verken blank-pads verdien eller strimler etterfølgende emner. Tegnverdier tilordnes intakt, slik at ingen informasjon går tapt. Hvis tegnverdien er lengre enn den deklarerte lengden påVARCHAR2 variabelen, avbryter PL/SQL tildelingen og hever VALUE_ERROR. PL / SQL verken avkorter verdien eller prøver å trimme etterfølgende emner.

Sammenligning Av Tegnverdier

du kan bruke relasjonsoperatorene til å sammenligne tegnverdier for likhet eller ulikhet. Sammenligninger er basert på sorteringssekvensen som brukes for tegnsettet i databasen. En tegnverdi er større enn en annen hvis den følger den i sorteringssekvensen. For eksempel, gitt deklarasjonene

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

følgende HVIS betingelse er sant:

IF last_name1 > last_name2 THEN ...

ANSI / ISO SQL krever at to tegnverdier som sammenlignes, har like lengder. Så, hvis begge verdiene i en sammenligning har datatype CHAR, brukes blank-padding semantikk. Det vil si, før du sammenligner tegnverdier av ulik lengde, pl / SQL blank-pads kortere verdi til lengden på lengre verdi. For eksempel, gitt erklæringene

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

følgende IF betingelse er sant:

IF last_name1 = last_name2 THEN ...

hvis en av verdiene i en sammenligning har datatype VARCHAR2, brukes ikke-blank-polstring semantikk. Det vil si at når man sammenligner tegnverdier av ulik lengde, gjør PL/SQL ingen justeringer og bruker de nøyaktige lengdene. For eksempel, gitt erklæringene

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

følgende IF betingelsen er usann:

IF last_name1 = last_name2 THEN ...

hvis en verdi i en sammenligning har datatype VARCHAR2 og den andre verdien har datatype CHAR, ikke-blank-polstring semantikk brukes. Men husk at når du tilordner en tegnverdi til en CHAR variabel, hvis verdien er kortere enn den deklarerte lengden på variabelen, pl / SQL blank-pads verdien til den deklarerte lengden. Så, gitt erklæringene

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

følgende IF tilstanden er falsk fordi verdien av last_name2 inneholder fem etterfølgende emner:

IF last_name1 = last_name2 THEN ...

alle strenglitteraler har datatype CHAR. Så, hvis begge verdiene i en sammenligning er bokstavelige, brukes blank-polstring semantikk. Hvis en verdi er en bokstavelig, brukes tompolstring semantikk bare hvis den andre verdien har datatype CHAR.

Sette Inn Tegnverdier

når du setter inn verdien AV EN pl / SQL-tegnvariabel i En Oracle – databasekolonne, avhenger om verdien er tom polstret eller ikke av kolonnetypen, ikke av variabeltypen.

Når Du setter inn en tegnverdi i en CHAR databasekolonne, fjerner Ikke Oracle etterfølgende mellomrom. Hvis verdien er kortere enn den definerte bredden på kolonnen, legger Oracle blank-verdien til den definerte bredden. Som et resultat går informasjon om etterfølgende emner tapt. Hvis tegnverdien er lengre enn den definerte bredden på kolonnen, avbryter Oracle innsatsen og genererer en feil.

Når Du setter inn en tegnverdi i en VARCHAR2 databasekolonne, fjerner Ikke Oracle etterfølgende mellomrom. Hvis verdien er kortere enn den definerte bredden på kolonnen, betyr Ikke Oracle tom-pad verdien. Tegnverdier lagres intakt, slik at ingen informasjon går tapt. Hvis tegnverdien er lengre enn den definerte bredden på kolonnen, avbryter Oracle innsatsen og genererer en feil.

Merk: de samme reglene gjelder ved oppdatering.

når du setter inn tegnverdier, for å sikre at ingen etterfølgende emner lagres, bruk funksjonen RTRIM, som trimmer etterfølgende emner. Et eksempel følger:

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

Velge Tegnverdier

Når du velger en verdi fra En Oracle-databasekolonne til en pl / SQL-tegnvariabel, avhenger om verdien er blank polstret eller ikke av variabeltypen, ikke av kolonnetypen.

når du velger en kolonneverdi i enCHAR variabel, hvis verdien er kortere enn den deklarerte lengden av variabelen, pl/SQL blank-pads verdien til den deklarerte lengden. Som et resultat går informasjon om etterfølgende emner tapt. Hvis tegnverdien er lengre enn den deklarerte lengden til variabelen, avbryter pl / SQL tildelingen og hever VALUE_ERROR.

når du velger en kolonneverdi i enVARCHAR2 variabel, HVIS verdien er kortere enn den deklarerte lengden av variabelen, PL/SQL verken blank-pads verdien eller strimler etterfølgende emner. Tegnverdier lagres intakt, slik at ingen informasjon går tapt.

når du for eksempel velger en tom polstret CHAR kolonneverdi i en VARCHAR2 variabel, blir ikke de etterfølgende emnene fjernet. Hvis tegnverdien er lengre enn den deklarerte lengden påVARCHAR2 variabelen, avbryter PL/SQL tildelingen og hever VALUE_ERROR.

Merk: de samme reglene gjelder ved henting.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.