Risposte:
Per ora sono sinonimi.
VARCHAR
è riservato Oracle
per supportare la distinzione tra NULL
e stringa vuota in futuro, come ANSI
prescrive lo standard.
VARCHAR2
non distingue tra una NULL
stringa vuota e mai lo farà.
Se fai affidamento su una stringa vuota ed NULL
essendo la stessa cosa, dovresti usare VARCHAR2
.
VARCHAR2
perché attualmente non esiste un tipo che si comporti come VARCHAR
dovrebbe. In effetti, non dovresti usarlo VARCHAR
affatto fino a quando non viene implementato correttamente.
where x is NULL
i risultati rendimenti diversi da where x = ''
fa non significa che NULL
e ''
sono in alcun modo diverso. Il diverso comportamento è dovuto =
all'operatore.
Attualmente VARCHAR si comporta esattamente come VARCHAR2. Tuttavia, il tipo VARCHAR
non deve essere utilizzato in quanto è riservato per un utilizzo futuro.
Tratto da: differenza tra CHAR, VARCHAR, VARCHAR2
VARCHAR
non deve essere utilizzato. L'ho modificato
Tratto dall'ultima versione stabile stabile della produzione Oracle 12.2: tipi di dati
La differenza principale è che si VARCHAR2
tratta di un tipo di dati interno ed VARCHAR
è un tipo di dati esterno . Quindi dobbiamo capire la differenza tra un tipo di dati interno ed esterno ...
All'interno di un database, i valori sono memorizzati in colonne nelle tabelle. Internamente, Oracle rappresenta i dati in particolari formati noti come tipi di dati interni .
In generale, le applicazioni OCI (Oracle Call Interface) non funzionano con rappresentazioni interne di dati, ma con tipi di dati della lingua host predefiniti dalla lingua in cui sono scritti. Quando i dati vengono trasferiti tra un'applicazione client OCI e una tabella di database, le librerie OCI convertono i dati tra tipi di dati interni e tipi di dati esterni.
I tipi esterni offrono una comodità al programmatore consentendo di lavorare con tipi di lingua host anziché formati di dati proprietari. OCI può eseguire una vasta gamma di conversioni di tipi di dati durante il trasferimento di dati tra un database Oracle e un'applicazione OCI. Esistono più tipi di dati esterni OCI rispetto ai tipi di dati interni Oracle.
Il VARCHAR2
tipo di dati è una stringa di caratteri a lunghezza variabile con una lunghezza massima di 4000 byte. Se il parametro init.ora max_string_size è predefinito, la lunghezza massima di aVARCHAR2
può essere di 4000 byte. Se il parametro init.ora max_string_size = extended, la lunghezza massima di aVARCHAR2
può essere 32767 byte
Il VARCHAR
tipo di dati memorizza stringhe di caratteri di lunghezza variabile. I primi 2 byte contengono la lunghezza della stringa di caratteri, mentre i rimanenti byte contengono la stringa. La lunghezza specificata della stringa in un bind o in una chiamata di definizione deve includere i due byte di lunghezza, quindi il più grandeVARCHAR
stringa che può essere ricevuta o inviata è lunga 65533 byte, non 65535.
Un test rapido in un database 12.2 suggerisce che come un tipo di dati interna , Oracle considera ancora VARCHAR
come pseudotype per VARCHAR2
. NON SYNONYM
è un tipo di oggetto effettivo in 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)
Ci sono anche alcune implicazioni VARCHAR
per le opzioni del precompilatore ProC / C ++. Per i programmatori interessati, il collegamento è disponibile nella Guida del programmatore Pro * C / C ++
Dopo alcuni esperimenti (vedi sotto), posso confermare che da settembre 2017 non è cambiato nulla per quanto riguarda la funzionalità descritta nella risposta accettata : -
NULL
s per entrambiVARCHAR
eVARCHAR2
.Il motivo storico di queste due parole chiave è ben spiegato una risposta a una domanda diversa .
VARCHAR può memorizzare fino a 2000 byte di caratteri mentre VARCHAR2 può memorizzare fino a 4000 byte di caratteri.
Se dichiariamo il tipo di dati come VARCHAR, occuperà spazio per i valori NULL. Nel caso del tipo di dati VARCHAR2, non occuperà spazio per i valori NULL. per esempio,
name varchar(10)
riserverà 6 byte di memoria anche se il nome è "Ravi__", mentre
name varchar2(10)
riserverà spazio in base alla lunghezza della stringa di input. ad esempio, 4 byte di memoria per "Ravi__".
Qui, _ rappresenta NULL.
NOTA: varchar riserva lo spazio per i valori null e varchar2 non riserva lo spazio per i valori null.
VARCHAR
con CHAR
.
Attualmente sono uguali. ma prima
VARCHAR
è riservato da Oracle per supportare la distinzione tra NULL
e stringa vuota in futuro, come prescrive lo standard ANSI.
VARCHAR2
non distingue tra una NULL
stringa vuota e mai lo farà.
Emp_name varchar(10)
- se si immette un valore inferiore a 10 cifre, lo spazio rimanente non può essere eliminato. ha usato un totale di 10 spazi.
Emp_name varchar2(10)
- se si immette un valore inferiore a 10 cifre, lo spazio rimanente viene automaticamente eliminato
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;