Domanda Differenza tra VARCHAR2 (10 CHAR) e NVARCHAR2 (10)


Ho installato Oracle Database 10g Express Edition (Universal) con le impostazioni predefinite:

SELECT * FROM NLS_DATABASE_PARAMETERS;

NLS_CHARACTERSET               AL32UTF8                                 
NLS_NCHAR_CHARACTERSET         AL16UTF16                                

Dato che entrambi CHAR e NCHAR i tipi di dati sembrano accettare stringhe multi-byte, qual è la differenza esatta tra queste due definizioni di colonna?

VARCHAR2(10 CHAR)
NVARCHAR2(10)

44
2017-12-22 10:44


origine


risposte:


Il NVARCHAR2 il tipo di dati è stato introdotto da Oracle per i database che desiderano utilizzare Unicode per alcune colonne mantenendo un altro set di caratteri per il resto del database (che utilizza VARCHAR2). NVARCHAR2 è un tipo di dati solo Unicode.

Un motivo per cui si potrebbe voler utilizzare NVARCHAR2 potrebbe essere il fatto che il DB utilizzi un set di caratteri non Unicode e si desideri comunque poter archiviare i dati Unicode per alcune colonne senza modificare il set di caratteri primario. Un altro motivo potrebbe essere che si desidera utilizzare due set di caratteri Unicode (AL32UTF8 per i dati che provengono principalmente dall'Europa occidentale, AL16UTF16 per i dati che provengono per lo più dall'Asia ad esempio) perché set di caratteri diversi non memorizzano gli stessi dati in modo altrettanto efficiente.

Entrambe le colonne nel tuo esempio (Unicode VARCHAR2(10 CHAR) e NVARCHAR2(10)) sarebbe in grado di memorizzare gli stessi dati, tuttavia la memorizzazione dei byte sarà diversa. Alcune stringhe possono essere memorizzate in modo più efficiente nell'uno o nell'altro.

Nota anche che alcune funzionalità non funzioneranno con NVARCHAR2, vedi questa domanda SO:


76
2017-12-22 13:21



NVARCHAR2 è un Unicode-solo Conservazione.

Sebbene entrambi i tipi di dati siano tipi di dati stringa di lunghezza variabile, è possibile notare la differenza nel modo in cui memorizzano i valori. Ogni carattere è memorizzato in byte. Come sappiamo, non tutte le lingue hanno alfabeti con la stessa lunghezza, ad esempio l'alfabeto inglese ha bisogno di 1 byte per carattere, tuttavia, lingue come giapponese o cinese richiedono più di 1 byte per memorizzare un carattere.

Quando si specifica varchar2 (10), stai dicendo al DB solo questo 10 byte dei dati saranno archiviati. Ma quando dici NVARCHAR2 (10), significa 10 caratteri sarà memorizzato. In questo caso, non devi preoccuparti del numero di byte che ogni personaggio prende.


0
2017-12-02 18:57



Mi chiedo se NVARCHAR2 (1) e VARCHAR2 (1) agiscano in modo diverso per quanto riguarda il valore null / vuoto?

Dai test, sembra lo stesso ..

Può avere qualche sorpresa

cioè confrontando la stringa vuota con! = 'Y' non restituirà le righe di stringa vuote .. vale a dire la stringa vuota non fa né non equivale a 'Y' ...

ho bisogno della funzione wrapper nvl
per esempio. e nvl (superiore (WP. "OW_IS_MISRUN"), 'N')! = 'Y'

selezionare   contare(*) a partire dal   "DATA_HUB". "OW_WELL_PERFORATION" WP dove   WP.UWI = 17038046

7

seleziona conteggio (*) a partire dal   "DATA_HUB". "OW_WELL_PERFORATION" WP dove   WP.UWI = 17038046   e superiore (WP. "OW_IS_MISRUN")! = 'Y'

1

seleziona conteggio (*) a partire dal   "DATA_HUB". "OW_WELL_PERFORATION" WP dove   WP.UWI = 17038046   e superiore (WP. "OW_IS_MISRUN") = 'Y'

2

seleziona conteggio (*) a partire dal   "DATA_HUB". "OW_WELL_PERFORATION" WP dove   WP.UWI = 17038046   e nvl (superiore (WP. "OW_IS_MISRUN"), 'N')! = 'Y'

5


-2
2017-11-16 00:37