Diferença entre BYTE e CHAR nos tipos de dados da coluna

166

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
)
Guido
fonte

Respostas:

265

Vamos supor que o conjunto de caracteres do banco de dados seja UTF-8, que é a configuração recomendada nas 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 talvez não seja possível armazenar 11 caracteres no campo, porque alguns deles precisam de mais de um byte para armazenar, por exemplo, caracteres que não sejam em inglês.

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

David Sykes
fonte
55
Observe que a semântica do comprimento dos caracteres não afeta o comprimento máximo de 4000 bytes para a VARCHAR2. Declarar a VARCHAR2(4000 CHAR)permitirá menos de 4000 caracteres se alguns caracteres exigirem vários bytes de armazenamento.
Justin Caverna
@ David Sykes É semanticamente o mesmo com o NVARCHAR (11)?
Nap
@ Nap Não tanto quanto eu sei. Acredito que o parâmetro size na declaração do tipo NVARCHAR tenha o significado que está no VARCHAR2. ou seja, para garantir espaço de armazenamento suficiente para 11 caracteres (não bytes) no conjunto de caracteres NVARCHAR, você diria NVARCHAR (11 CHAR). NOTA: Na verdade, eu não verifiquei isso. Eu nunca usei o NVARCHAR.
David Sykes
Para ilustrar ainda mais a diferença entre os dois: quatro caracteres de um valor codificado em hexadecimal (ou seja, "0xFF") ou três caracteres decimais (ou seja, "255") podem ser "compactados" quando representados como um único byte: 11111111. Isso poderia então ser útil para sinalizadores de bit (até 8 configurações), operações bit a bit, etc.
Matt Borja
Note-se que 1 como um caractere ASCII (dec 49.) É 1001001 enquanto 1 como um bit é 00000001.
Matt Borja
21

Um tem exatamente espaço para 11 bytes, o outro para exatamente 11 caracteres. Alguns conjuntos de caracteres, como as 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.

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

Matthias Kestenholz
fonte
17

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

  1. Limita o campo a 11 BYTE
  2. Limita campo para 11 CHAR acters


Conclusão: 1 CHAR não é igual a 1 BYTE.

user15453
fonte
4

Não tenho certeza, pois não sou usuário do Oracle, mas presumo que a diferença esteja quando você usa conjuntos de caracteres de vários bytes, como Unicode (UTF-16/32). Nesse caso, 11 bytes podem representar menos de 11 caracteres.

Além disso, esses tipos de campo podem ser tratados de maneira diferente 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 o Oracle) .

Seldaek
fonte