Выберите VARCHAR2(size)
вместо CHAR(size)
, так как это экономит место и время:
Удивительно, но CHAR(size)
позволяет присваивать строки длиной len
короче size
. В этом случае ORACLE добавляет size-len
пробелов к строке для типов данных CHAR
и VARCHAR
и сохраняет size
символов.
Тип данных VARCHAR2
поставляется без дополнения, сохраняются только символы len
.
CREATE TABLE Demo(col1 CHAR(4), col2 VARCHAR2(4));
INSERT INTO Demo (col1, col2) VALUES ('c', 'v');
В результате
col1='c '
(дополняется 3 пробелами, поскольку size
из col1
равно 4
, а длина 'c'
равна только 1). col1='c'
оценивает FALSE, только TRIM(col1)='c'
оценивает TRUE,
тогда
col2='v'
оценивает TRUE без TRIM()
, что делает сравнение более эффективным.
Кроме того, сравнение между двумя значениями VARCHAR2
не выполняется быстро, если их длины различаются (независимо от их size
). В этом случае никакие посимвольные сравнения не требуются.
С CHAR
и тем же size
проверка длины всегда не проходит из-за заполнения. Таким образом, каждый символ должен сравниваться до тех пор, пока не будет достигнуто первое несоответствие или конец строки, в зависимости от того, что произойдет первым.
Поскольку и CHAR(size)
, и VARCHAR2(size)
не препятствуют присвоению значений короче size
, определите ограничение длины, если вам нужно убедиться, что только значения с предопределенной длиной (которая должна равняться size
) могут быть назначенным.