Что именно означает, что размер поля VARCHAR2 объявлен как 1 BYTE? (в Oracle DB)
Я не так в database
и у меня есть следующие сомнения.
Я знаю, что могу объявить поле varchar2
используя номер символа, который он может содержать.
Но в базе данных Oracle
над которой я работаю, я обнаружил, что поле (с именем PDF) определяется как:
VARCHAR2(1 BYTE)
Что именно означает? Сколько в нем содержится?
Другое сомнение: в чем именно разница между полем VARCHAR
полем VARCHAR2
?
Tnx
Ответы
Ответ 1
Вы можете объявлять столбцы/переменные как varchar2 (n CHAR) и varchar2 (n байт).
n CHAR означает, что переменная будет содержать n символов. В многобайтовых наборах символов вы не всегда знаете, сколько байтов вы хотите сохранить, но вы хотите гарантировать хранение определенного количества символов.
n байтов означает просто количество байтов, которое вы хотите сохранить.
varchar устарел. Не используйте его.
В чем разница между varchar и varchar2?
Ответ 2
Тип данных 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)
Ответ 3
Чтобы ответить на первый вопрос:
Да, это означает, что 1 байт выделяет для 1 символа. Посмотрите на этот пример
SQL> conn / as sysdba
Connected.
SQL> create table test (id number(10), v_char varchar2(10));
Table created.
SQL> insert into test values(11111111111,'darshan');
insert into test values(11111111111,'darshan')
*
ERROR at line 1:
ORA-01438: value larger than specified precision allows for this column
SQL> insert into test values(11111,'darshandarsh');
insert into test values(11111,'darshandarsh')
*
ERROR at line 1:
ORA-12899: value too large for column "SYS"."TEST"."V_CHAR" (actual: 12,
maximum: 10)
SQL> insert into test values(111,'Darshan');
1 row created.
SQL>
И чтобы ответить на следующий вопрос:
Разница между varchar2
и varchar
:
-
varchar
может хранить до 2000 bytes
символов, а varchar2
может хранить до 4000 bytes
символов.
- Если мы объявим тип данных как
varchar
, то он займет место для NULL values
. В случае varchar2
datatype он будет not
занимать любое пространство.
Ответ 4
это означает, что только один байт будет выделен для каждого символа - поэтому, если вы используете многобайтовые кодировки, ваш 1 символ не будет соответствовать
если вы знаете, что у вас должно быть хотя бы достаточно места для 1 символа, не используйте синтаксис BYTE, если вы точно не знаете, сколько места вам нужно будет хранить этот байт
если у вас есть сомнения, используйте VARCHAR2 (1 CHAR)
то же самое ответил здесь Разница между BYTE и CHAR в типах столбцов
Кроме того, в 12c max для varchar2 теперь 32k, а не 4000. Если вам нужно больше, используйте CLOB
в Oracle, не используйте VARCHAR
Ответ 5
Максимальное выделение памяти в SQL.
VARCHAR : 4000 BYTE
VARCHAR2 : 4000 BYTE
Теперь, когда мы объявляем VARCHAR2(1 BYTE)
или VARCHAR2(1)
. Это означает, что он может хранить до 1 символа.
Подробнее