B CHAR versus Varchar2 semantică

această anexă explică diferențele semantice dintre CHARși VARCHAR2 tipuri de bază. Aceste diferențe subtile, dar importante, intră în joc atunci când atribuiți, comparați, inserați, actualizați, selectați sau preluați valori de caractere.

această anexă discută următoarele subiecte:

atribuirea valorilor caracterelor compararea valorilor caracterelor inserarea valorilor caracterelor selectarea valorilor caracterelor

atribuirea valorilor caracterelor

când atribuiți o valoare caracterelor unei variabileCHAR, dacă valoarea este mai mică decât lungimea declarată a variabilei, PL / SQL blank-pads valoarea la lungimea declarată. Deci, informațiile despre semifabricatele finale sunt pierdute. În exemplul următor, valoarea atribuită last_name include șase spații libere, nu doar unul:

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

dacă valoarea caracterului este mai mare decât lungimea declarată a variabileiCHAR, PL/SQL anulează atribuirea și ridică excepția predefinităVALUE_ERROR. PL / SQL nu trunchiază valoarea și nici nu încearcă să decupeze semifabricatele. De exemplu, având în vedere declarația

acronym CHAR(4);

următoarea atribuire ridică VALUE_ERROR:

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

când atribuiți o valoare de caracter unei variabileVARCHAR2, dacă valoarea este mai mică decât lungimea declarată a variabilei, PL / SQL nu blochează valoarea și nici nu blochează spațiile libere. Valorile caracterelor sunt atribuite intacte, astfel încât nu se pierd informații. Dacă valoarea caracterului este mai mare decât lungimea declarată a variabilei VARCHAR2, PL/SQL anulează atribuirea și ridică VALUE_ERROR. PL / SQL nu trunchiază valoarea și nici nu încearcă să decupeze semifabricatele.

compararea valorilor caracterelor

puteți utiliza operatorii relaționali pentru a compara valorile caracterelor pentru egalitate sau inegalitate. Comparațiile se bazează pe secvența de colaționare utilizată pentru setul de caractere al bazei de date. O valoare de caracter este mai mare decât alta dacă o urmează în secvența de colaționare. De exemplu, având în vedere declarațiile

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

următoarele dacă condiția este adevărată:

IF last_name1 > last_name2 THEN ...

ANSI / ISO SQL necesită ca două valori de caractere comparate să aibă lungimi egale. Deci, dacă ambele valori dintr-o comparație au datatype CHAR, se utilizează semantica blank-padding. Adică, înainte de a compara valorile caracterelor de lungime inegală, PL/SQL blank-tamponează valoarea mai scurtă cu lungimea valorii mai lungi. De exemplu, având în vedere declarațiile

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

următoarea IF condiția este adevărată:

IF last_name1 = last_name2 THEN ...

Dacă oricare valoare dintr-o comparație are tipul de date VARCHAR2, se utilizează semantica non-blank-padding. Adică, atunci când se compară valorile caracterelor de lungime inegală, PL / SQL nu face ajustări și folosește lungimile exacte. De exemplu, având în vedere declarațiile

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

următoarea IF condiția este falsă:

IF last_name1 = last_name2 THEN ...

dacă o valoare dintr-o comparație are tipul de date VARCHAR2 iar cealaltă valoare are datatype CHAR, se utilizează semantica non-blank-padding. Dar, amintiți-vă, când atribuiți o valoare de caracter unei variabile CHAR, dacă valoarea este mai mică decât lungimea declarată a variabilei, PL/SQL blank-pads valoarea la lungimea declarată. Deci, având în vedere declarațiile

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

următoarea IF condiția este falsă deoarece valoarea last_name2 include cinci spații libere:

IF last_name1 = last_name2 THEN ...

toate șirurile literalii au tipul de date CHAR. Deci, dacă ambele valori dintr-o comparație sunt literali, se utilizează semantica de umplutură goală. Dacă o valoare este literală, semantica de umplere necompletată este utilizată numai dacă cealaltă valoare are tipul de date CHAR.

inserarea valorilor caracterelor

când introduceți valoarea unei variabile de caractere PL / SQL într-o coloană Oracle database, dacă valoarea este necompletată sau nu depinde de tipul coloanei, nu de tipul variabilei.

când introduceți o valoare de caracter într-oCHAR coloana bazei de date, Oracle nu benzi spații libere la sfârșit. Dacă valoarea este mai mică decât lățimea definită a coloanei, Oracle blank-tampoane valoarea la lățimea definită. Ca urmare, se pierd informații despre semifabricatele finale. Dacă valoarea caracterelor este mai mare decât lățimea definită a coloanei, Oracle anulează inserarea și generează o eroare.

când introduceți o valoare de caracter într-oVARCHAR2 coloana bazei de date, Oracle nu benzi la sfârșit spații libere. Dacă valoarea este mai mică decât lățimea definită a coloanei, Oracle nu blank-pad valoarea. Valorile caracterelor sunt stocate intacte, astfel încât nu se pierd informații. Dacă valoarea caracterelor este mai mare decât lățimea definită a coloanei, Oracle anulează inserarea și generează o eroare.

notă: aceleași reguli se aplică la actualizare.

când introduceți valori de caractere, pentru a vă asigura că nu sunt stocate spații libere, utilizați funcțiaRTRIM, care decupează spații libere. Un exemplu urmează:

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

selectarea valorilor caracterelor

când selectați o valoare dintr-o coloană Oracle database într-o variabilă de caractere PL / SQL, dacă valoarea este necompletată sau nu depinde de tipul variabilei, nu de tipul coloanei.

când selectați o valoare de coloană într-o variabilăCHAR, dacă valoarea este mai mică decât lungimea declarată a variabilei, PL / SQL blank-pads valoarea la lungimea declarată. Ca urmare, se pierd informații despre semifabricatele finale. Dacă valoarea caracterului este mai mare decât lungimea declarată a variabilei, PL/SQL anulează atribuirea și ridică VALUE_ERROR.

când selectați o valoare coloană într-oVARCHAR2 variabilă, în cazul în care valoarea este mai mică decât lungimea declarată a variabilei, PL / SQL nici blank-tampoane valoarea și nici benzi la sfârșit spații libere. Valorile caracterelor sunt stocate intacte, astfel încât nu se pierd informații.

de exemplu, atunci când selectați o CHAR valoare coloană într-o VARCHAR2 variabilă, semifabricatele nu sunt decupate. Dacă valoarea caracterului este mai mare decât lungimea declarată a variabilei VARCHAR2, PL/SQL anulează atribuirea și ridică VALUE_ERROR.

notă: aceleași reguli se aplică la preluare.

Lasă un răspuns

Adresa ta de email nu va fi publicată.