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

166

В 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
)
Guido
источник

Ответы:

265

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

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

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

Дэвид Сайкс
источник
55
Обратите внимание, что семантика длины символа не влияет на максимальную длину 4000 байтов для a VARCHAR2. Объявление VARCHAR2(4000 CHAR)допускает менее 4000 символов, если для некоторых символов требуется несколько байтов памяти.
Джастин Кейв
@ Дэвид Сайкс Это семантически то же самое с NVARCHAR (11)?
Сон
@Nap Не так далеко, насколько я знаю. Я считаю, что параметр размера в объявлении типа NVARCHAR имеет значение, как в VARCHAR2. то есть, чтобы обеспечить достаточно места для хранения 11 символов (не байтов) в наборе символов NVARCHAR, вы должны сказать NVARCHAR (11 CHAR). ПРИМЕЧАНИЕ: я на самом деле не проверял это. Я никогда не использовал NVARCHAR.
Дэвид Сайкс
Чтобы дополнительно проиллюстрировать разницу между этими двумя: четыре символа шестнадцатеричного значения (то есть «0xFF») или три десятичных знака (то есть «255») могут быть «сжаты», когда представлены одним байтом: 11111111. Это может затем полезно для битовых флагов (до 8 настроек), побитовых операций и т. д.
Мэтт Борха
Обратите внимание, что 1 в качестве символа ASCII (дек. 49) равен 1001001, а 1 в качестве бита - 00000001.
Мэтт Борха
21

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

Смотрите также http://www.joelonsoftware.com/articles/Unicode.html

Матиас Кестенхольц
источник
17

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

  1. Ограничивает поле до 11 байт
  2. Ограничивает поле до 11 символов CHAR


Вывод: 1 CHAR не равен 1 BYTE.

user15453
источник
4

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

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

Seldaek
источник