Что именно означает, что размер поля VARCHAR2 объявлен как 1 байт? (в БД Oracle)

мне не так нравится database и у меня есть следующие сомнения.

Я знаю, что могу объявить varchar2 поле, используя номер символа, который он может содержать.

а в Oracle база данных, над которой я работаю, я обнаружил, что поле (с именем PDF) определяется как:

VARCHAR2(1 BYTE)

что именно означает? Сколько персонажа он содержит?

другое сомнение: в чем именно разница между VARCHAR поле и VARCHAR2

5 ответов


вы можете объявить столбцы / переменные как varchar2(N CHAR) и varchar2 (n байт).

n CHAR означает, что переменная будет содержать n символов. В многобайтовых наборах символов вы не всегда знаете, сколько байтов вы хотите сохранить, но вы хотите гарантировать хранение определенного количества символов.

n байт означает просто количество байтов, которое вы хотите сохранить.

varchar устарел. Не используйте его. в чем разница между varchar и varchar2?


Я не знаю точной разницы между VARCHAR и VARCHAR2 но ответ прост: не используйте VARCHAR используйте только VARCHAR2.

если ваша база данных работает на однобайтовые кодировки (например,US7ASCII, WE8MSWIN1252 или WE8ISO8859P1) это не имеет никакого значения, используете ли вы VARCHAR2(x BYTE) или VARCHAR2(1 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-байтовый.

если у вас нет 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

чтобы ответить на первый вопрос:
Да, это означает, что 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 :

  1. VARCHAR может хранить до 2000 bytes символов, а VARCHAR2 может хранить до 4000 bytes символов.
  2. если мы объявим тип данных как VARCHAR тогда он будет занимать место для NULL values в случае VARCHAR2 datatype это будет not занимать любое пространство.

Это означает, что на символ будет выделен только один байт - поэтому, если вы используете многобайтовые кодировки, ваш 1 символ не будет соответствовать

Если вы знаете, что у вас должно быть достаточно места для 1 символа, не используйте синтаксис байтов, если вы точно не знаете, сколько места вам нужно для хранения этого байта

когда сомневаетесь, используйте VARCHAR2 (1 CHAR)

то же самое ответили здесь разница между байтом и CHAR в столбце типы данных

кроме того, в 12c Макс для varchar2 теперь 32k, а не 4000. Если вам нужно больше, чем это, используйте CLOB

в Oracle не используйте VARCHAR


максимальное выделение памяти в SQL.

VARCHAR  : 4000 BYTE
VARCHAR2 : 4000 BYTE

Теперь, когда мы заявляем VARCHAR2(1 BYTE) или VARCHAR2(1). Это означает, что он может хранить до 1 символа.

подробнее