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

В Oracle в чем разница между:

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 BYTE),
 ID_CLIENT NUMBER
)

и

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
 ID_CLIENT NUMBER
)

person Guido    schedule 17.09.2008    source источник


Ответы (5)


Предположим, что набор символов базы данных - UTF-8, что является рекомендуемой настройкой в ​​последних версиях Oracle. В этом случае для хранения некоторых символов в базе данных требуется более 1 байта.

Если вы определяете поле как VARCHAR2(11 BYTE), Oracle может использовать до 11 байтов для хранения, но вы, возможно, не сможете сохранить 11 символов в поле, потому что некоторые из них требуют для хранения более одного байта, например неанглийские символы.

Определяя поле как VARCHAR2(11 CHAR), вы сообщаете Oracle, что он может использовать достаточно места для хранения 11 символов, независимо от того, сколько байтов требуется для хранения каждого из них. Для одного символа может потребоваться до 4 байтов.

person David Sykes    schedule 17.09.2008
comment
Обратите внимание, что семантика длины символа не влияет на максимальную длину 4000 байт для VARCHAR2. Объявление VARCHAR2(4000 CHAR) позволит использовать менее 4000 символов, если для некоторых символов требуется несколько байтов памяти. - person Justin Cave; 19.07.2012
comment
@ Дэвид Сайкс. Это семантически то же самое с NVARCHAR (11)? - person Nap; 06.01.2015
comment
@Nap Насколько я знаю. Я считаю, что параметр размера в объявлении типа NVARCHAR имеет значение, как в VARCHAR2. то есть, чтобы обеспечить достаточно места для хранения 11 символов (не байтов) в наборе символов NVARCHAR, вы должны сказать NVARCHAR (11 CHAR). ПРИМЕЧАНИЕ: я на самом деле не проверял это. Я никогда не использовал NVARCHAR. - person David Sykes; 14.01.2015
comment
Чтобы дополнительно проиллюстрировать разницу между двумя: четыре символа шестнадцатеричного значения (например, 0xFF) или три десятичных символа (например, 255) могут быть сжаты, когда представлены в виде одного байта: 11111111. Затем это может быть полезно для битовых флагов ( до 8 настроек), побитовые операции и т. д. - person Matt Borja; 08.05.2015
comment
Обратите внимание, что 1 как символ ASCII (dec. 49) - это 1001001, а 1 как бит - это 00000001. - person Matt Borja; 08.05.2015
comment
Если вы определяете переменную в PLSQL как VARCHAR2 (11 CHAR), сколько места будет зарезервировано? Учитывая utf8 Это должно быть 44 байта, потому что каждый символ может иметь до 4 байтов, и Oracle не имеет возможности заранее узнать, какие символы будут сохранены в переменной. - person Roland; 25.06.2015
comment
@Roland Я на самом деле не тестировал это, но полностью ожидаю, что это так. Было бы странно, если бы это не было. - person David Sykes; 01.07.2015
comment
@DavidSykes, должен ли я знать, какой символ занимает более одного байта? - person 151291; 24.11.2015
comment
@ 151291 Насколько я знаю, это зависит от набора символов базы данных. Если для базы данных задано значение UTF-8, то все, кроме первых 127 символов таблицы ASCII, занимает более 1 байта. - person David Sykes; 26.11.2015

В одном месте ровно 11 байтов, в другом - ровно 11 символов. Некоторые наборы символов, такие как варианты Unicode, могут использовать более одного байта на символ, поэтому в 11-байтовом поле может быть меньше 11 символов в зависимости от кодировки.

См. Также http://www.joelonsoftware.com/articles/Unicode.html.

person Matthias Kestenholz    schedule 17.09.2008

В зависимости от конфигурации системы размер CHAR, измеренный в БАЙТАХ, может варьироваться. В ваших примерах:

  1. Ограничивает поле до 11 BYTE
  2. Ограничивает поле до 11 актеров CHAR


Вывод: 1 СИМВОЛ не равен 1 БАЙТУ.

person user15453    schedule 17.09.2008

Я не уверен, поскольку я не являюсь пользователем Oracle, но предполагаю, что разница заключается в том, что вы используете многобайтовые наборы символов, такие как Unicode (UTF-16/32). В этом случае 11 байтов могут составлять менее 11 символов.

Также эти типы полей могут обрабатываться по-разному в отношении акцентированных символов или регистра, например, 'binaryField (ete) = "été"' не будет соответствовать, а 'charField (ete) = "été"' может (снова не уверен в Oracle) .

person Seldaek    schedule 17.09.2008

Проще говоря, когда вы пишете NAME VARCHAR2(11 BYTE), в этой переменной можно разместить только 11 байтов.

Независимо от того, какой набор символов вы используете, например, если вы используете Unicode (UTF-16), тогда только половина размера Name может быть размещена в NAME.

С другой стороны, если вы напишете NAME VARCHAR2(11 CHAR), тогда NAME может вместить 11 символов независимо от их кодировки символов.

BYTE используется по умолчанию, если вы не укажете BYTE или CHAR

Таким образом, если вы пишете NAME VARCHAR2(4000 BYTE) и используете кодировку символов Unicode (UTF-16), то в NAME можно разместить только 2000 символов.

Это означает, что ограничение размера переменной применяется в BYTES, и зависит от кодировки символов, сколько символов может быть помещено в этот vraible.

person Aman Singh Rajpoot    schedule 05.05.2021