Разница между BYTE и CHAR в типах данных столбцов - PullRequest
156 голосов
/ 17 сентября 2008

В 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
)

Ответы [ 4 ]

249 голосов
/ 17 сентября 2008

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

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

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

20 голосов
/ 17 сентября 2008

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

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

16 голосов
/ 17 сентября 2008

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

  1. Ограничение поля до 11 БАЙТ
  2. Ограничение поля до 11 CHAR acters

<ч /> Вывод: 1 CHAR не равен 1 байту.

3 голосов
/ 17 сентября 2008

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

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

...