Разница между 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
)

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

<ч/" > Вывод: 1 CHAR не равен 1 BYTE.

Ответ 4

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

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