Choose VARCHAR2(size) over CHAR(size), since this is more space and time efficient:
Surprisingly or not, CHAR(size) allows assignment of strings with a length len shorter than size. In this case, ORACLE appends size-len spaces to the string for datatypes CHAR and VARCHAR and stores size characters.
The VARCHAR2 datatype comes without padding, only len characters are stored.
CREATE TABLE Demo(col1 CHAR(4), col2 VARCHAR2(4));
INSERT INTO Demo (col1, col2) VALUES ('c', 'v');
As a result,
col1='c ' (padded with 3 trailing spaces, since the size of col1 is 4 and the length of 'c' is only 1). col1='c' evaluates FALSE, only TRIM(col1)='c' evaluates TRUE,
whereas
col2='v' evaluates TRUE withoutTRIM(), making the comparison more efficient.
Furthermore, comparisons between two VARCHAR2 values fail fast if their lengths differ (independent of their size). In this case, no character-wise comparisons are required.
With CHAR and same size, the length check always fails due to padding. Thus, every character has to be compared until the first character mismatch or the end-of-string has been reached, whichever occurs first.
Since both CHAR(size) and VARCHAR2(size) don't prevent assignments of values shorter than size, define a length constraint if you need to assure that only values with a predefined length (which should equal size) can be assigned.