Qual è la differenza tra varchar e varchar2 in Oracle?


Risposte:


337

Per ora sono sinonimi.

VARCHARè riservato Oracleper supportare la distinzione tra NULLe stringa vuota in futuro, come ANSIprescrive lo standard.

VARCHAR2non distingue tra una NULLstringa vuota e mai lo farà.

Se fai affidamento su una stringa vuota ed NULLessendo la stessa cosa, dovresti usare VARCHAR2.


40
Non avevo mai sentito questa logica prima, è utile. Grazie. Per la cronaca, è ancora del tutto ridicolo che il tipo di personaggio principale in Oracle sia "varchar2". Questo non colpisce nessun altro come un kludge terribile? Sembra come avrei risolto alcuni problemi nella mia prima settimana di apprendimento del programma.
Ian Varley,

7
@Ian: il tipo principale è VARCHAR2perché attualmente non esiste un tipo che si comporti come VARCHARdovrebbe. In effetti, non dovresti usarlo VARCHARaffatto fino a quando non viene implementato correttamente.
Quassnoi,

11
Grazie, @Quassnoi. Quindi immagino che la parte stupida sia che Oracle non ha un VARCHAR adeguato come ogni altro database, allora? C'è qualcosa di stupido qui, ne sono sicuro ... :)
Ian Varley,

11
@Ian: quando Oracle è stato sviluppato, non c'erano standard. Quando emersero gli standard, aveva già un peso di app legacy. Sappiamo tutti come succede.
Quassnoi,

5
Siamo spiacenti, in realtà è stato @UnKnown a scrivere il commento errato a cui stavo rispondendo . Il fatto che where x is NULLi risultati rendimenti diversi da where x = ''fa non significa che NULLe ''sono in alcun modo diverso. Il diverso comportamento è dovuto =all'operatore.
Dan Lenski


29

Tratto dall'ultima versione stabile stabile della produzione Oracle 12.2: tipi di dati

La differenza principale è che si VARCHAR2tratta 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 VARCHAR2tipo 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 VARCHARtipo 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 VARCHARcome 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 VARCHARper le opzioni del precompilatore ProC / C ++. Per i programmatori interessati, il collegamento è disponibile nella Guida del programmatore Pro * C / C ++


1
questo significa che VARCHARtratta ancora '' == null?

2
Sì. La discussione sui tipi interno vs esterno sopra è dal riferimento OCI. Il 12,2 SQL di riferimento di porta ancora lo stesso 'non usare' affermazione che ha sempre avuto per VARCHAR.
William Robertson,

Questo è il motivo per cui ho discusso delle differenze OCI, altrimenti è praticamente riservato per un utilizzo futuro o come si dice 'lunghezza variabile' che potrebbe essere un suggerimento per set di caratteri come UTF8 multi-byte ...
sandman

1
È stato mostrato che i valori dichiarati come VARCHAR sono memorizzati nel database come VARCHAR2, tuttavia la lunghezza massima di VARCHAR (65533 byte) è maggiore della lunghezza massima di VARCHAR2 (32767 byte). Come gestisce questo database?
Piotr Dobrogost,

IIRC, molto tempo fa (forse Oracle 6?) C'era un tipo VARCHAR che si comportava in modo errato rispetto al riempimento dello spazio - o stava troncando gli spazi? AAR, VARCHAR2 era la risposta. Oracle ha detto che riporteranno VARCHAR ma, ne sono certo, ci saranno dei digrignamenti di denti quando la stringa vuota NON È NULL.
JMD,


0
  1. VARCHAR può memorizzare fino a 2000 byte di caratteri mentre VARCHAR2 può memorizzare fino a 4000 byte di caratteri.

  2. 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.


2
Penso che questa risposta è confuso VARCHARcon CHAR.
Jon Heller,

0

Attualmente sono uguali. ma prima

  1. Da qualche parte in rete, ho letto che

VARCHARè riservato da Oracle per supportare la distinzione tra NULLe stringa vuota in futuro, come prescrive lo standard ANSI.

VARCHAR2non distingue tra una NULLstringa vuota e mai lo farà.

  1. Anche,

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


Mi sono imbattuto in questo post di recente, si ricorda che non è corretto. Eseguire i seguenti ed entrambi i campi saranno 3 caratteri: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;
Brian Leach

-1

VARCHAR è il sinonimo di VARCHAR2. Tuttavia, non dovresti usare VARCHAR perché Oracle potrebbe cambiare la sua semantica in futuro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.