it-swarm-pt.tech

Diferença entre BYTE e CHAR em tipos de dados de coluna

No Oracle, qual é a diferença entre:

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

e

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

Vamos supor que o conjunto de caracteres do banco de dados seja UTF-8, que é a configuração recomendada em versões recentes do Oracle. Nesse caso, alguns caracteres levam mais de 1 byte para armazenar no banco de dados.

Se você definir o campo como VARCHAR2(11 BYTE), o Oracle poderá usar até 11 bytes para armazenamento, mas você pode não conseguir armazenar 11 caracteres no campo, porque alguns deles levam mais de um byte para armazenar, por exemplo, caracteres não ingleses.

Ao definir o campo como VARCHAR2(11 CHAR) você diz ao Oracle que ele pode usar espaço suficiente para armazenar 11 caracteres, não importando quantos bytes sejam necessários para armazenar cada um. Um único caractere pode exigir até 4 bytes.

249
David Sykes

Um tem exatamente espaço para 11 bytes, o outro para exatamente 11 caracteres. Alguns conjuntos de caracteres, como variantes Unicode, podem usar mais de um byte por caractere, portanto, o campo de 11 bytes pode ter espaço para menos de 11 caracteres, dependendo da codificação.

Veja também http://www.joelonsoftware.com/articles/Unicode.html

20
Matthias Kestenholz

Dependendo da configuração do sistema, o tamanho do CHAR medido em BYTES pode variar. Nos seus exemplos:

  1. Limita o campo a 11 Personagens
  2.  



16
user15453

Não tenho certeza desde que eu não sou um usuário do Oracle, mas suponho que a diferença reside quando você usa conjuntos de caracteres multi-byte, como Unicode (UTF-16/32). Nesse caso, 11 Bytes poderiam ter menos de 11 caracteres.

Além disso, esses tipos de campo podem ser tratados diferentemente em relação a caracteres acentuados ou maiúsculas e minúsculas, por exemplo, 'binaryField (ete) = "été"' não corresponderá enquanto charField (ete) = "été" 'pode (novamente não ter certeza sobre Oracle) .

3
Seldaek