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.