Ao migrar tabelas provenientes de outros SGBDs para Oracle, uma das tarefas padrão é substituir todos os VARCHAR(n)
campos por VARCHAR2(n)
campos (desde que n <= 4000).
Por que o Oracle chama esse tipo de dados VARCHAR2
e não apenas VARCHAR
como outros SGBDs?
Parece que a Oracle já teve planos de dar uma definição diferente para VARCHAR do que para VARCHAR2 . Ele disse isso aos clientes e não recomenda o uso de VARCHAR . Quaisquer que fossem seus planos, a partir de 11.2.0.2 VARCHAR é idêntico a VARCHAR2 . Aqui está o que o SQL Language Reference 11g Release 2 diz:
O PL/SQL User's Guide and Reference 10g Release 2 coloca desta forma:
O documento Database Concepts 10g Release 2 diz a mesma coisa em termos mais fortes:
A documentação do Oracle 9.2 e 8.1.7 dizem essencialmente a mesma coisa, portanto, embora a Oracle continuamente desencoraje o uso de VARCHAR , até agora eles não fizeram nada para alterar sua paridade com VARCHAR2 .
Atualmente, os dois são sinônimos.
VARCHAR é um tipo de dados padrão ANSI, mas a implementação do Oracle do tipo de dados VARCHAR viola o padrão ANSI por considerar a string vazia como NULL (a implementação do Oracle é anterior ao padrão ANSI). Como Leigh aponta, a Oracle declarou que a semântica do tipo de dados VARCHAR pode mudar no futuro com relação a como a string vazia é tratada. Se e quando isso acontecer, a semântica do tipo de dados VARCHAR2 permanecerá a mesma. Usar o tipo de dados VARCHAR2 é mais seguro porque você não precisa se preocupar que alguma versão futura do Oracle quebrará seu código fazendo com que strings vazias não sejam mais consideradas NULL.
Porque no padrão SQL original, um VARCHAR tinha 255 caracteres, e a Oracle estava pelo menos tendo uma tentativa de conformidade com os padrões naqueles dias.
Atualmente VARCHAR2 otimiza o uso de memória usando bytes com base no número de caracteres. Isso significa que uma variável VARCHAR2(10) pode usar 2,4,5,6 etc bytes de memória se contiver um número menor de caracteres.
Considerando que VARCHAR é de tamanho fixo. Um VARCHAR(10) sempre manterá 10 bytes de memória.