B CHAR versus VARCHAR2 semantik

denna bilaga förklarar de semantiska skillnaderna mellanCHAR ochVARCHAR2 bastyper. Dessa subtila men viktiga skillnader spelar in när du tilldelar, jämför, infogar, uppdaterar, väljer eller hämtar teckenvärden.

denna bilaga diskuterar följande ämnen:

tilldela Teckenvärden jämföra Teckenvärden infoga Teckenvärden välja Teckenvärden

tilldela Teckenvärden

När du tilldelar ett teckenvärde till en CHAR variabel, om värdet är kortare än variabelns deklarerade längd, PL/SQL blank-pads värdet till den deklarerade längden. Så, information om efterföljande ämnen går förlorad. I följande exempel innehåller värdet som tilldelats last_name sex efterföljande ämnen, inte bara en:

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

om teckenvärdet är längre än den angivna längden för variabelnCHAR, avbryter PL/SQL tilldelningen och höjer det fördefinierade undantagetVALUE_ERROR. PL / SQL varken trunkerar värdet eller försöker trimma avslutande ämnen. Till exempel, med tanke på deklarationen

acronym CHAR(4);

följande tilldelning höjer VALUE_ERROR:

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

När du tilldelar ett teckenvärde till enVARCHAR2 variabel, om värdet är kortare än den angivna längden på variabeln, PL / SQL varken blank-pads värdet eller remsor avslutande ämnen. Teckenvärden tilldelas intakta, så ingen information går förlorad. Om teckenvärdet är längre än den deklarerade längden på variabeln VARCHAR2 avbryter PL/SQL tilldelningen och höjer VALUE_ERROR. PL / SQL varken trunkerar värdet eller försöker trimma avslutande ämnen.

jämföra Teckenvärden

Du kan använda relationella operatorer för att jämföra teckenvärden för jämlikhet eller ojämlikhet. Jämförelser baseras på den sorteringssekvens som används för databasteckenuppsättningen. Ett teckenvärde är större än ett annat om det följer det i sorteringssekvensen. Till exempel, givet deklarationerna

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

följande om villkoret är sant:

IF last_name1 > last_name2 THEN ...

ANSI/ISO SQL kräver att två teckenvärden som jämförs har lika längder. Så, om båda värdena i en jämförelse har datatyp CHAR, används blank-padding semantik. Det vill säga, innan du jämför teckenvärden med ojämn längd, PL / SQL blank-pads det kortare värdet till längden på det längre värdet. Till exempel, med tanke på deklarationerna

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

följande IF villkoret är sant:

IF last_name1 = last_name2 THEN ...

om något av värdena i en jämförelse har datatyp VARCHAR2, icke-blank-padding semantik används. Det vill säga, när man jämför teckenvärden med ojämn längd, gör PL/SQL inga justeringar och använder exakta längder. Till exempel, med tanke på deklarationerna

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

följande IF villkoret är falskt:

IF last_name1 = last_name2 THEN ...

om ett värde i en jämförelse har datatyp VARCHAR2 och det andra värdet har datatyp CHAR, semantik som inte är blank används. Men kom ihåg, när du tilldelar ett teckenvärde till en CHAR variabel, om värdet är kortare än den deklarerade längden på variabeln, PL/SQL blank-pads värdet till den deklarerade längden. Så, med tanke på deklarationerna

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

följande IF villkoret är falskt eftersom värdet på last_name2 innehåller fem efterföljande ämnen:

IF last_name1 = last_name2 THEN ...

alla strängbokstäver har datatyp CHAR. Så, om båda värdena i en jämförelse är bokstäver, används blank-padding semantik. Om ett värde är en bokstavlig, används blank-padding semantik endast om det andra värdet har datatyp CHAR.

infoga Teckenvärden

När du infogar värdet för en PL / SQL-teckenvariabel i en Oracle-databaskolumn beror huruvida värdet är tomt eller inte på kolumntypen, inte på variabeltypen.

När du infogar ett teckenvärde i enCHAR databaskolumn, tar Oracle inte bort avslutande ämnen. Om värdet är kortare än den definierade bredden av kolumnen, Oracle blank-pads värdet till den definierade bredden. Som ett resultat förloras information om efterföljande ämnen. Om teckenvärdet är längre än kolumnens definierade bredd avbryter Oracle insatsen och genererar ett fel.

När du infogar ett teckenvärde i enVARCHAR2 databaskolumn, tar Oracle inte bort avslutande ämnen. Om värdet är kortare än den definierade bredden av kolumnen, inte Oracle inte Tom-pad värdet. Teckenvärden lagras intakta, så ingen information går förlorad. Om teckenvärdet är längre än kolumnens definierade bredd avbryter Oracle insatsen och genererar ett fel.

Obs: samma regler gäller vid uppdatering.

När du sätter in teckenvärden, för att säkerställa att inga efterföljande ämnen lagras, använd funktionen RTRIM, som trimmar efterföljande ämnen. Ett exempel följer:

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älja Teckenvärden

När du väljer ett värde från en Oracle-databaskolumn till en PL/SQL-teckenvariabel, om värdet är tomt eller inte beror på variabeltypen, inte på kolumntypen.

När du väljer ett kolumnvärde i enCHAR variabel, om värdet är kortare än variabelns deklarerade längd, PL/SQL blank-pads värdet till den deklarerade längden. Som ett resultat förloras information om efterföljande ämnen. Om teckenvärdet är längre än variabelns deklarerade längd avbryter PL/SQL tilldelningen och höjer VALUE_ERROR.

När du väljer ett kolumnvärde i enVARCHAR2 variabel, om värdet är kortare än den angivna längden på variabeln, PL / SQL varken blank-pads värdet eller remsor avslutande ämnen. Teckenvärden lagras intakta, så ingen information går förlorad.

När du till exempel väljer en tom vadderad CHAR kolumnvärde i en VARCHAR2 variabel, avlägsnas inte de bakre ämnena. Om teckenvärdet är längre än den deklarerade längden på variabeln VARCHAR2 avbryter PL/SQL tilldelningen och höjer VALUE_ERROR.

Obs: samma regler gäller vid hämtning.

Lämna ett svar

Din e-postadress kommer inte publiceras.