Respostas:
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.
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
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) .
VARCHAR2
. Declarar aVARCHAR2(4000 CHAR)
permitirá menos de 4000 caracteres se alguns caracteres exigirem vários bytes de armazenamento.