Что именно означает, что размер поля 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
:
-
VARCHAR
может хранить до2000 bytes
символов, аVARCHAR2
может хранить до4000 bytes
символов. - если мы объявим тип данных как
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 символа.