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.