Что именно означает, что размер поля 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 символа.

Подробнее