Qual é a diferença entre os tipos de dados VARCHAR e VARCHAR2 da Oracle?

Respostas:

26

Parece que a Oracle já planejou dar uma definição diferente ao VARCHAR e ao VARCHAR2 . Ele informou isso aos clientes e recomenda não usar o VARCHAR . Quaisquer que fossem seus planos, a partir do 11.2.0.2, o VARCHAR é idêntico ao VARCHAR2 . Aqui está o que o SQL Language Reference 11g Release 2 diz:

Não use o tipo de dados VARCHAR. Use o tipo de dados VARCHAR2. Embora o tipo de dados VARCHAR atualmente seja sinônimo de VARCHAR2, o tipo de dados VARCHAR está programado para ser redefinido como um tipo de dados separado usado para cadeias de caracteres de tamanho variável em comparação com diferentes semânticas de comparação.

O Guia do Usuário PL / SQL e a Referência 10g Release 2 colocam desta maneira:

Atualmente, VARCHAR é sinônimo de VARCHAR2. No entanto, em versões futuras do PL / SQL, para acomodar os padrões SQL emergentes, o VARCHAR pode se tornar um tipo de dados separado com diferentes semânticas de comparação. É uma boa ideia usar o VARCHAR2 em vez do VARCHAR.

O documento Database Concepts 10g Release 2 diz a mesma coisa em termos mais fortes:

O tipo de dados VARCHAR é sinônimo do tipo de dados VARCHAR2. Para evitar possíveis alterações no comportamento, sempre use o tipo de dados VARCHAR2 para armazenar cadeias de caracteres de comprimento variável.

A documentação do Oracle 9.2 e 8.1.7 diz essencialmente a mesma coisa, embora a Oracle desencoraje continuamente o uso do VARCHAR , até agora eles não fizeram nada para mudar sua paridade com o VARCHAR2 .

Leigh Riffel
fonte
Lembro-me de varchar2 no Oracle 8i, mas não tenho certeza se era o mesmo um varchar.
22411 bernd_k
Há indicações de que em algum momento antes de 8i a definição pode ter sido diferente.
Leigh Riffel
Eu costumava pensar que havia um limite de comprimento diferente varcharantes da versão 8, mas não consigo encontrar nada respeitável para apoiar isso e agora me pergunto se é apenas um mito.
Jack Douglas
@ Jack Douglas - Não consigo encontrar nada na documentação do Oracle 7 sobre isso. Em docs.oracle.com/cd/A57673_01/DOC/dcommon/oin/indexj.htm >> Oracle 7 Server >> Conceitos de servidor >> Tipos de dados Oracle (não é possível vincular diretamente a ele) diz praticamente a mesma coisa mais tarde versões. Em outra seção da documentação da versão 7, diz que na versão 6 Varchar e Varchar2 eram sinônimos de char.
Leigh Riffel
25

Atualmente, os dois são sinônimos.

VARCHAR é um tipo de dados padrão ANSI, mas a implementação do tipo de dados VARCHAR pela Oracle viola o padrão ANSI, considerando que a sequência vazia é NULL (a implementação da Oracle é anterior ao padrão ANSI). Como salienta Leigh, a Oracle afirmou que a semântica do tipo de dados VARCHAR pode mudar no futuro em relação à forma como a cadeia vazia é tratada. Se e quando isso acontecer, a semântica do tipo de dados VARCHAR2 permanecerá a mesma. O uso do tipo de dados VARCHAR2 é mais seguro, pois você não precisa se preocupar com o fato de que alguma versão futura do Oracle interrompa seu código, fazendo com que cadeias vazias não sejam mais consideradas NULL.

Justin Cave
fonte
3

Como no padrão SQL original, um VARCHAR tinha 255 caracteres e a Oracle tinha pelo menos uma facada na conformidade com os padrões naqueles dias.

Gaius
fonte
Isso dá esperança de ver o Oracle varchar3 (máximo) em alguns anos.
18711 bernd_k
O Sql-server não teve problemas para aumentar o comprimento permitido de 255 para 8000 (e agora até o máximo). Por que a Oracle precisava de um tipo de dados diferente.
18711 bernd_k
1
Não há necessidade de a varchar(max), basta usar aCLOB
a_horse_with_no_name 4/12
3
CLOB tem semânticas diferentes para VARCHAR2
Gaius