Qual é a diferença entre varchar e varchar2?
oracle
sqldatatypes
hrishi
fonte
fonte
Respostas:
Por enquanto, eles são sinônimos.
VARCHAR
é reservadoOracle
para oferecer suporte à distinção entreNULL
e cadeia vazia no futuro, conformeANSI
prescrito pelo padrão.VARCHAR2
não faz distinção entre umaNULL
string e uma string vazia, e nunca o fará.Se você confia na cadeia vazia e
NULL
é a mesma coisa, deve usarVARCHAR2
.fonte
VARCHAR2
porque atualmente não há nenhum tipo que se comporte comoVARCHAR
deveria. Na verdade, você não deve usáVARCHAR
-lo até que seja implementado corretamente.where x is NULL
retorna resultados diferenteswhere x = ''
que não significa queNULL
e''
são de forma alguma diferente. O comportamento diferente é devido ao=
operador.Atualmente, o VARCHAR se comporta exatamente da mesma forma que o VARCHAR2. No entanto, o tipo
VARCHAR
não deve ser usado, pois está reservado para uso futuro.Retirado de: Diferença entre CHAR, VARCHAR, VARCHAR2
fonte
VARCHAR
não deve ser usado. Eu editeiRetirado da versão estável mais recente da produção Oracle 12.2: Tipos de Dados
A principal diferença é que
VARCHAR2
é um tipo de dados interno eVARCHAR
é um tipo de dados externo . Portanto, precisamos entender a diferença entre um tipo de dados interno e externo ...Dentro de um banco de dados, os valores são armazenados em colunas nas tabelas. Internamente, o Oracle representa dados em formatos específicos, conhecidos como tipos de dados internos .
Em geral, os aplicativos OCI (Oracle Call Interface) não funcionam com representações internas de dados, mas com tipos de dados no idioma do host predefinidos pelo idioma em que foram gravados. Quando os dados são transferidos entre um aplicativo cliente OCI e uma tabela de banco de dados, as bibliotecas OCI convertem os dados entre tipos de dados internos e externos.
Tipos externos fornecem uma conveniência para o programador, possibilitando o trabalho com tipos de idioma do host em vez de formatos de dados proprietários. O OCI pode executar uma ampla variedade de conversões de tipo de dados ao transferir dados entre um banco de dados Oracle e um aplicativo OCI. Existem mais tipos de dados externos do OCI que tipos de dados internos do Oracle.
O
VARCHAR2
tipo de dados é uma cadeia de caracteres de tamanho variável com um comprimento máximo de 4000 bytes. Se o parâmetro init.ora max_string_size for o padrão, o comprimento máximo de aVARCHAR2
poderá ser 4000 bytes. Se o parâmetro init.ora max_string_size = estendido, o comprimento máximo de aVARCHAR2
pode ser 32767 bytesO
VARCHAR
tipo de dados armazena cadeias de caracteres de comprimento variável. Os 2 primeiros bytes contêm o comprimento da cadeia de caracteres e os bytes restantes contêm a cadeia. O comprimento especificado da sequência em uma ligação ou chamada de definição deve incluir os dois bytes de comprimento; portanto, a maiorVARCHAR
sequência que pode ser recebida ou enviada tem 65533 bytes, e não 65535.Um teste rápido de um banco de dados de 12.2 sugere que, como um tipo de dados internos , a Oracle ainda trata um
VARCHAR
como um pseudotipo paraVARCHAR2
. NÃOSYNONYM
é um tipo de objeto real no Oracle.Também existem algumas implicações
VARCHAR
para as opções do ProC / C ++ Precompiler. Para programadores interessados, o link está em: Pro * C / C ++ Programmer's Guidefonte
VARCHAR
ainda trata'' == null
?Após algumas experiências (veja abaixo), posso confirmar que, em setembro de 2017, nada mudou com relação à funcionalidade descrita na resposta aceita : -
NULL
s para ambosVARCHAR
eVARCHAR2
.O motivo histórico dessas duas palavras-chave é explicado bem em uma resposta a uma pergunta diferente .
fonte
O VARCHAR pode armazenar até 2000 bytes de caracteres, enquanto o VARCHAR2 pode armazenar até 4000 bytes de caracteres.
Se declararmos o tipo de dados como VARCHAR, ele ocupará espaço para valores NULL. No caso do tipo de dados VARCHAR2, ele não ocupará espaço para valores NULL. por exemplo,
name varchar(10)
reservará 6 bytes de memória, mesmo se o nome for 'Ravi__', enquanto
reservará espaço de acordo com o comprimento da sequência de entrada. por exemplo, 4 bytes de memória para 'Ravi__'.
Aqui, _ representa NULL.
NOTA: varchar reservará espaço para valores nulos e varchar2 não reservará espaço para valores nulos.
fonte
VARCHAR
comCHAR
.Atualmente, eles são os mesmos. mas anteriormente
VARCHAR
é reservado pela Oracle para oferecer suporte à distinção entreNULL
e sequência vazia no futuro, conforme prescreve o padrão ANSI.VARCHAR2
não faz distinção entre umaNULL
string e uma string vazia, e nunca o fará.Emp_name varchar(10)
- se você digitar um valor inferior a 10 dígitos, o espaço restante não poderá ser excluído. utilizou um total de 10 espaços.Emp_name varchar2(10)
- se você digitar um valor inferior a 10 dígitos, o espaço restante será excluído automaticamentefonte
create table deleteme_table(v varchar(10), v2 varchar2(10)); insert into deleteme_table (v, v2) values ('abc','abc'); select v, length(v), v2, length(v2) from deleteme_table;
VARCHAR é o sinônimo de VARCHAR2. No entanto, você não deve usar o VARCHAR porque o Oracle pode alterar sua semântica no futuro.
fonte