it-swarm.it

Qual è la differenza tra i tipi di dati Oracle VARCHAR e VARCHAR2?

Quando si esegue la migrazione di tabelle provenienti da altri DBMS su Oracle, una delle attività standard è sostituire tutti i campi VARCHAR(n) con VARCHAR2(n) fields (fornito n <= 4000) .

Perché Oracle chiama questo tipo di dati VARCHAR2 e non solo VARCHAR come altri DBMS?

19
bernd_k

Sembrerebbe che Oracle un tempo avesse in programma di dare una definizione diversa a [~ # ~] varchar [~ # ~] rispetto a VARCHAR2 . Lo ha detto ai clienti e sconsiglia di usare [~ # ~] varchar [~ # ~] . Qualunque fossero i loro piani, a partire dall'11.2.0.2 [~ # ~] varchar [~ # ~] è identico a VARCHAR2 . Ecco cosa SQL Language Reference 11g Release 2 dice:

Non utilizzare il tipo di dati VARCHAR. Utilizzare invece il tipo di dati VARCHAR2. Sebbene il tipo di dati VARCHAR sia attualmente sinonimo di VARCHAR2, il tipo di dati VARCHAR è pianificato per essere ridefinito come tipo di dati separato utilizzato per stringhe di caratteri a lunghezza variabile rispetto a semantiche di confronto diverse.

Manuale dell'utente e riferimento PL/SQL 10g versione 2 lo dice in questo modo:

Attualmente, VARCHAR è sinonimo di VARCHAR2. Tuttavia, nelle versioni future di PL/SQL, per adattarsi agli standard SQL emergenti, VARCHAR potrebbe diventare un tipo di dati separato con una semantica di confronto diversa. È una buona idea usare VARCHAR2 anziché VARCHAR.

Il documento Database Concepts 10g Release 2 dice la stessa cosa in termini più forti:

Il tipo di dati VARCHAR è sinonimo del tipo di dati VARCHAR2. Per evitare possibili cambiamenti nel comportamento, utilizzare sempre il tipo di dati VARCHAR2 per memorizzare stringhe di caratteri di lunghezza variabile.

La documentazione Oracle 9.2 e 8.1.7 dice essenzialmente la stessa cosa, quindi anche se Oracle scoraggia continuamente l'uso di [~ # ~] varchar [~ # ~] , finora non hanno fatto nulla per cambiare la sua parità con VARCHAR2 .

26
Leigh Riffel

Attualmente, i due sono sinonimi.

VARCHAR è un tipo di dati standard ANSI ma l'implementazione di Oracle del tipo di dati VARCHAR viola lo standard ANSI considerando che la stringa vuota è NULL (l'implementazione di Oracle precede lo standard ANSI). Come sottolineato da Leigh, Oracle ha affermato che la semantica del tipo di dati VARCHAR potrebbe cambiare in futuro rispetto al modo in cui viene trattata la stringa vuota. Se e quando ciò accade, la semantica del tipo di dati VARCHAR2 rimarrà la stessa. L'uso del tipo di dati VARCHAR2 è più sicuro perché non devi preoccuparti che qualche versione futura di Oracle rompa il tuo codice facendo sì che le stringhe vuote non vengano più considerate NULL.

25
Justin Cave

Perché nello standard SQL originale un VARCHAR era di 255 caratteri, e Oracle aveva almeno una mancia per la conformità agli standard in quei giorni.

3
Gaius