B Semantica CHAR versus VARCHAR2

Questa appendice spiega le differenze semantiche tra i tipi di baseCHAR eVARCHAR2. Queste sottili ma importanti differenze entrano in gioco quando si assegnano, confrontano, inseriscono, aggiornano, selezionano o recuperano i valori dei caratteri.

Questa appendice discute i seguenti argomenti:

Assegnazione di Valori di Carattere Confrontando i Valori di Carattere Inserimento di Valori di Carattere Selezione di Valori di Carattere

Assegnazione di Valori di Carattere

Quando si assegna un valore di carattere è un CHAR variabile, se il valore è minore di quella dichiarata la lunghezza della variabile, PL/SQL vuoto-pastiglie il valore dichiarato lunghezza. Quindi, le informazioni sugli spazi vuoti finali sono perse. Nell’esempio seguente, il valore assegnato a last_name include sei spazi vuoti finali, non solo uno:

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

Se il valore del carattere è più lungo della lunghezza dichiarata della variabileCHAR, PL/SQL interrompe l’assegnazione e solleva l’eccezione predefinitaVALUE_ERROR. PL / SQL non tronca il valore né tenta di tagliare gli spazi vuoti finali. Ad esempio, data la dichiarazione

acronym CHAR(4);

la seguente assegnazione genera VALUE_ERROR:

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

Quando si assegna un valore di carattere a una variabileVARCHAR2, se il valore è più breve della lunghezza dichiarata della variabile, PL / SQL non cancella il valore né rimuove gli spazi vuoti finali. I valori dei caratteri vengono assegnati intatti, quindi nessuna informazione viene persa. Se il valore del carattere è più lungo della lunghezza dichiarata della variabile VARCHAR2, PL/SQL interrompe l’assegnazione e genera VALUE_ERROR. PL / SQL non tronca il valore né tenta di tagliare gli spazi vuoti finali.

Confronto dei valori dei caratteri

È possibile utilizzare gli operatori relazionali per confrontare i valori dei caratteri per l’uguaglianza o la disuguaglianza. I confronti si basano sulla sequenza di raccolta utilizzata per il set di caratteri del database. Un valore di carattere è maggiore di un altro se lo segue nella sequenza di raccolta. Ad esempio, date le dichiarazioni

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

la seguente condizione IF è true:

IF last_name1 > last_name2 THEN ...

ANSI/ISO SQL richiede che due valori di caratteri confrontati abbiano lunghezze uguali. Quindi, se entrambi i valori in un confronto hanno datatype CHAR, viene utilizzata la semantica blank-padding. Cioè, prima di confrontare i valori dei caratteri di lunghezza disuguale, PL / SQL blank-pads il valore più breve alla lunghezza del valore più lungo. Ad esempio, date le dichiarazioni

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

la seguente condizione IF è true:

IF last_name1 = last_name2 THEN ...

Se uno dei valori in un confronto ha datatype VARCHAR2, la semantica di riempimento non vuoto è usata. Cioè, quando si confrontano i valori dei caratteri di lunghezza disuguale, PL / SQL non apporta regolazioni e utilizza le lunghezze esatte. Per esempio, date le dichiarazioni

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

il seguente IF la condizione è falsa:

IF last_name1 = last_name2 THEN ...

Se un valore in un confronto di tipo VARCHAR2 e l’altro valore è datatype CHAR, camere non-vuoto-imbottitura semantica sono utilizzati. Ma, ricorda, quando assegni un valore di carattere a una variabileCHAR, se il valore è più breve della lunghezza dichiarata della variabile, PL/SQL blank-pads il valore alla lunghezza dichiarata. Così, date le dichiarazioni

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

il seguente IF la condizione è falsa, perché il valore di last_name2 include cinque spazi vuoti finali:

IF last_name1 = last_name2 THEN ...

Tutti i valori letterali di stringa sono datatype CHAR. Quindi, se entrambi i valori in un confronto sono letterali, viene utilizzata la semantica di riempimento vuoto. Se un valore è un valore letterale, la semantica blank-padding viene utilizzata solo se l’altro valore ha datatype CHAR.

Inserimento di valori di caratteri

Quando si inserisce il valore di una variabile di caratteri PL / SQL in una colonna del database Oracle, se il valore è vuoto o meno dipende dal tipo di colonna, non dal tipo di variabile.

Quando si inserisce un valore di carattere in una colonna di databaseCHAR, Oracle non rimuove gli spazi vuoti finali. Se il valore è più breve della larghezza definita della colonna, Oracle blank-pads il valore alla larghezza definita. Di conseguenza, le informazioni sugli spazi vuoti finali vengono perse. Se il valore del carattere è più lungo della larghezza definita della colonna, Oracle interrompe l’insert e genera un errore.

Quando si inserisce un valore di carattere in una colonna di databaseVARCHAR2, Oracle non rimuove gli spazi vuoti finali. Se il valore è più breve della larghezza definita della colonna, Oracle non cancella il valore. I valori dei caratteri vengono memorizzati intatti, quindi nessuna informazione viene persa. Se il valore del carattere è più lungo della larghezza definita della colonna, Oracle interrompe l’insert e genera un errore.

Nota: le stesse regole si applicano durante l’aggiornamento.

Quando si inseriscono valori di carattere, per assicurarsi che non vengano memorizzati spazi vuoti finali, utilizzare la funzioneRTRIM, che taglia gli spazi vuoti finali. Un esempio segue:

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

Selezione dei valori dei caratteri

Quando si seleziona un valore da una colonna di database Oracle in una variabile di caratteri PL / SQL, se il valore è vuoto o meno dipende dal tipo di variabile, non dal tipo di colonna.

Quando si seleziona un valore di colonna in una variabile CHAR, se il valore è più breve della lunghezza dichiarata della variabile, PL / SQL blank-pads il valore alla lunghezza dichiarata. Di conseguenza, le informazioni sugli spazi vuoti finali vengono perse. Se il valore del carattere è più lungo della lunghezza dichiarata della variabile, PL / SQL interrompe l’assegnazione e genera VALUE_ERROR.

Quando si seleziona un valore di colonna in un VARCHAR2 variabile, se il valore è più breve della lunghezza dichiarata della variabile, PL / SQL né blank-pads il valore né strisce spazi vuoti finali. I valori dei caratteri vengono memorizzati intatti, quindi nessuna informazione viene persa.

Ad esempio, quando si seleziona un valore di colonnaCHARriempito in una variabileVARCHAR2, gli spazi vuoti finali non vengono rimossi. Se il valore del carattere è più lungo della lunghezza dichiarata della variabile VARCHAR2, PL/SQL interrompe l’assegnazione e genera VALUE_ERROR.

Nota: le stesse regole si applicano durante il recupero.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.