Respostas:
Por enquanto, eles são sinônimos.
VARCHAR
é reservado Oracle
para oferecer suporte à distinção entre NULL
e cadeia vazia no futuro, conforme ANSI
prescrito pelo padrão.
VARCHAR2
não faz distinção entre uma NULL
string e uma string vazia, e nunca o fará.
Se você confia na cadeia vazia e NULL
é a mesma coisa, deve usar VARCHAR2
.
VARCHAR2
porque atualmente não há nenhum tipo que se comporte como VARCHAR
deveria. Na verdade, você não deve usá VARCHAR
-lo até que seja implementado corretamente.
where x is NULL
retorna resultados diferentes where x = ''
que não significa que NULL
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
VARCHAR
não deve ser usado. Eu editei
Retirado 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 e VARCHAR
é 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 a VARCHAR2
poderá ser 4000 bytes. Se o parâmetro init.ora max_string_size = estendido, o comprimento máximo de a VARCHAR2
pode ser 32767 bytes
O 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 maior VARCHAR
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 para VARCHAR2
. NÃO SYNONYM
é um tipo de objeto real no Oracle.
SQL> select substr(banner,1,80) from v$version where rownum=1;
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> create table test (my_char varchar(20));
Table created.
SQL> desc test
Name Null? Type
MY_CHAR VARCHAR2(20)
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 Guide
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 .
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
name varchar2(10)
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.
VARCHAR
com CHAR
.
Atualmente, eles são os mesmos. mas anteriormente
VARCHAR
é reservado pela Oracle para oferecer suporte à distinção entre NULL
e sequência vazia no futuro, conforme prescreve o padrão ANSI.
VARCHAR2
não faz distinção entre uma NULL
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 automaticamente
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;