it-swarm-ru.tech

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

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

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

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

249
David Sykes

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

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

20
Matthias Kestenholz

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

  1. Ограничивает поле до 11 Персонажи
  2.  



16
user15453

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

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

3
Seldaek