VARCHAR
тип данных является синонимом типа данных VARCHAR2
. Чтобы избежать возможных изменений в поведении, всегда используйте тип данных VARCHAR2
для хранения символьных строк переменной длины.
Если ваша база данных работает с однобайтовым набором символов (например, US7ASCII
, WE8MSWIN1252
или WE8ISO8859P1
), не имеет значения, используете ли вы VARCHAR2(x BYTE)
или VARCHAR2(x CHAR)
.
Это имеет значение только тогда, когда ваша БД работает с многобайтовым набором символов (например, AL32UTF8
или AL16UTF16
). Вы можете просто увидеть это в этом примере:
CREATE TABLE my_table (
VARCHAR2_byte VARCHAR2(1 BYTE),
VARCHAR2_char VARCHAR2(1 CHAR)
);
INSERT INTO my_table (VARCHAR2_char) VALUES ('€');
1 row created.
INSERT INTO my_table (VARCHAR2_char) VALUES ('ü');
1 row created.
INSERT INTO my_table (VARCHAR2_byte) VALUES ('€');
INSERT INTO my_table (VARCHAR2_byte) VALUES ('€')
Error at line 10
ORA-12899: value too large for column "MY_TABLE"."VARCHAR2_BYTE" (actual: 3, maximum: 1)
INSERT INTO my_table (VARCHAR2_byte) VALUES ('ü')
Error at line 11
ORA-12899: value too large for column "MY_TABLE"."VARCHAR2_BYTE" (actual: 2, maximum: 1)
VARCHAR2(1 CHAR)
означает, что вы можете сохранить до 1 символа, независимо от того, сколько в нем байтов. В случае Unicode один символ может занимать до 4 байтов.
VARCHAR2(1 BYTE)
означает, что вы можете сохранить символ, занимающий макс. 1 байт.
Если вы не укажете BYTE
или CHAR
, тогда значение по умолчанию будет взято из NLS_LENGTH_SEMANTICS
параметра сеанса.
Если у вас нет Oracle 12c, где вы можете установить MAX_STRING_SIZE=EXTENDED
, ограничение составляет VARCHAR2(4000 CHAR)
Однако VARCHAR2(4000 CHAR)
не означает, что вы гарантированно храните до 4000 символов. Предел по-прежнему составляет 4000 байтов, поэтому в худшем случае вы можете сохранить в таком поле не более 1000 символов.
См. Этот пример (€
в UTF-8 занимает 3 байта):
CREATE TABLE my_table2(VARCHAR2_char VARCHAR2(4000 CHAR));
BEGIN
INSERT INTO my_table2 VALUES ('€€€€€€€€€€');
FOR i IN 1..7 LOOP
UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char;
END LOOP;
END;
/
SELECT LENGTHB(VARCHAR2_char) , LENGTHC(VARCHAR2_char) FROM my_table2;
LENGTHB(VARCHAR2_CHAR) LENGTHC(VARCHAR2_CHAR)
---------------------- ----------------------
3840 1280
1 row selected.
UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char;
UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char
Error at line 1
ORA-01489: result of string concatenation is too long
См. Также Примеры и ограничения использования семантики BYTE и CHAR (NLS_LENGTH_SEMANTICS) (ID документа 144808.1)
person
Wernfried Domscheit
schedule
16.06.2015
CHAR(1)
. Имея строку переменной длины с макс. длина одного байта не имеет смысла. - person ibre5041   schedule 16.06.2015