Scegliere VARCHAR2(size)
sopra CHAR(size)
, dal momento che questo è più spazio e tempo efficiente:
Sorprendentemente o meno, CHAR(size)
consente l'assegnazione di stringhe di lunghezza inferiore a len
size
. In questo caso, ORACLE aggiunge gli spazi size-len
alla stringa per i tipi di dati CHAR
e VARCHAR
e memorizza i caratteri size
. Il tipo di dati VARCHAR2
viene fornito senza riempimento, solo i caratteri len
vengono memorizzati.
CREATE TABLE Demo(col1 CHAR(4), col2 VARCHAR2(4));
INSERT INTO Demo (col1, col2) VALUES ('c', 'v');
Come risultato,
col1='c '
(imbottita con 3 spazi finali, poiché la size
di col1
è 4
e la lunghezza di 'c'
è solo 1). col1='c'
viene valutata FALSE, solo TRIM(col1)='c'
valutata vera,
che
col2='v'
valutata vera senza TRIM()
, rendendo il confronto più efficiente.
Inoltre, i confronti tra due valori VARCHAR2
non riescono rapidamente se le loro lunghezze differiscono (indipendentemente dal loro size
). In questo caso, non sono richiesti confronti a livello di caratteri. Con CHAR
e lo stesso size
, la verifica della lunghezza non riesce sempre a causa del riempimento. Pertanto, ogni carattere deve essere confrontato fino a quando il primo carattere non corrisponde o la fine della stringa è stata raggiunta, a seconda di quale si verifica prima.
Dato che sia CHAR(size)
e VARCHAR2(size)
non ostacolano le assegnazioni di valori più brevi di size
, definire un vincolo di lunghezza se è necessario per assicurare che solo i valori con una lunghezza predefinita (che dovrebbe essere uguale size
) può essere assegnato.
fonte
2016-04-05 13:32:32
Err ... spazi extra nei campi VARCHAR2? O vuoi dire OldTable/CHAR = NewTable/VARCHAR2 confronti? –