2011-10-12 9 views
7

Devo utilizzare VARCHAR2 o CHAR come un tipo di dati in Oracle?: Devo utilizzare VARCHAR2 o CHAR

Mi è stato suggerito di utilizzare CHAR per queste nuove tabelle di cui ho bisogno ma sono preoccupato poiché queste nuove tabelle verranno utilizzate per popolare tabelle esistenti che utilizzano un tipo di dati VARCHAR2. Sono preoccupato per gli spazi aggiuntivi inseriti nei campi VARCHAR2 e con problemi di confronto. So che ci sono modi per confrontarli usando il ritaglio o la conversione, ma temo che renderà il mio codice disordinato e buggato.

Quali sono le tue opinioni?

+0

Err ... spazi extra nei campi VARCHAR2? O vuoi dire OldTable/CHAR = NewTable/VARCHAR2 confronti? –

risposta

8

Sono preoccupato per gli spazi aggiuntivi inseriti nei campi VARCHAR2 e con problemi di confronto. So che ci sono modi per confrontarli usando il ritaglio o la conversione, ma temo che renderà il mio codice disordinato e buggato.

In realtà è esattamente l'opposto. L'uso di CHAR costringerà le stringhe a una lunghezza fissa imbottendole con spazi se sono troppo corte. Pertanto, quando si confrontano i CHAR con le stringhe normali in qualsiasi app che utilizza i dati, l'app dovrebbe aggiungere un trim ogni volta. In altre parole, VARCHAR2 è la scelta che porta naturalmente a un codice più pulito.

In generale è necessario sempre utilizzare VARCHAR2, a meno che non si disponga di un motivo molto specifico per cui si desidera una colonna CHAR.

Se siete preoccupati per le stringhe che hanno spazi in più nella parte anteriore o alla fine, poi ci sono alcune opzioni che vengono in mente:

  • Assicurarsi che qualsiasi processo sta facendo gli inserti fa un assetto su di loro prima di inserire.
  • Aggiungere un vincolo di controllo sulla colonna che assicura che string = trim (stringa).
  • Aggiungere un trigger di livello riga prima che venga inserito un ritaglio sulle stringhe.
  • Assicurarsi che si fa un assetto sulle corde ogni volta che si esegue una query la tabella di
0

Suggerisco di attenersi a VARCHAR2.

È necessario utilizzare CHAR quando i dati sono una lunghezza fissa nota.

3

CHAR ha una semantica di confronto interessante. Se si utilizza solo VARCHAR2, non è necessario imparare la semantica CHAR. Onestamente, penso che se avessi un campo con un noto lenth fisso, lo definirei comunque come VARCHAR2 e usare un vincolo di controllo per forzare la sua lunghezza fissa, invece di apprendere la semantica di confronto CHAR.

Alcuni sostengono che i CHAR sono più efficienti per dati a lunghezza fissa poiché la lunghezza non deve essere memorizzata, ma è untrue on Oracle.

4

Leggi:

Citazione dall'articolo AskTom:

Il fatto che un CHAR/NCHAR non sia altro che un VARCHAR2/NVARCHAR2 travestito mi fa pensare che esistano solo due tipi di stringa di caratteri da prendere in considerazione, ovvero VARCHAR2 e NVARCHAR2. Non ho mai trovato un utilizzo per il tipo CHAR in qualsiasi applicazione. Dal momento che un tipo CHAR blocca sempre la stringa risultante su una larghezza fissa, scopriamo rapidamente che consuma lo storage massimo sia nel segmento della tabella sia in qualsiasi segmento di indice. Quello sarebbe già abbastanza grave, ma c'è un altro motivo importante per evitare i tipi CHAR/NCHAR : creano confusione nelle applicazioni che necessitano di recuperare queste informazioni (molti non possono "trovare" i loro dati dopo aver memorizzato ). La ragione di ciò si riferisce alle regole della comparazione della stringa di caratteri e alla severità con cui vengono eseguite.

+2

Si prega di notare che è necessario inserire le parti essenziali della risposta qui, su questo sito, o il tuo post rischia di essere eliminato [Vedi le FAQ dove si parla di risposte che sono 'a mala pena più di un link'.] (Http: // StackOverflow .com/faq # eliminazione) È possibile includere il collegamento, se lo si desidera, ma solo come "riferimento". La risposta dovrebbe essere autonoma senza bisogno del collegamento. – Taryn

+0

@bluefeet completato)) – gavenkoa

0

Scegliere VARCHAR2(size) sopra CHAR(size), dal momento che questo è più spazio e tempo efficiente:

Sorprendentemente o meno, CHAR(size) consente l'assegnazione di stringhe di lunghezza inferiore a lensize. In questo caso, ORACLE aggiunge gli spazi size-len alla stringa per i tipi di dati CHAR e VARCHAR e memorizza i caratteri size. Il tipo di dati VARCHAR2 viene fornito senza riempimento, solo i caratteri len vengono memorizzati.

CREATE TABLE Demo(col1 CHAR(4), col2 VARCHAR2(4)); 
INSERT INTO Demo (col1, col2) VALUES ('c', 'v'); 

Come risultato,

col1='c ' (imbottita con 3 spazi finali, poiché la size di col1 è 4 e la lunghezza di 'c' è solo 1). col1='c' viene valutata FALSE, solo TRIM(col1)='c' valutata vera,

che

col2='v' valutata vera senza TRIM(), rendendo il confronto più efficiente.

Inoltre, i confronti tra due valori VARCHAR2 non riescono rapidamente se le loro lunghezze differiscono (indipendentemente dal loro size). In questo caso, non sono richiesti confronti a livello di caratteri. Con CHAR e lo stesso size, la verifica della lunghezza non riesce sempre a causa del riempimento. Pertanto, ogni carattere deve essere confrontato fino a quando il primo carattere non corrisponde o la fine della stringa è stata raggiunta, a seconda di quale si verifica prima.

Dato che sia CHAR(size) e VARCHAR2(size) non ostacolano le assegnazioni di valori più brevi di size, definire un vincolo di lunghezza se è necessario per assicurare che solo i valori con una lunghezza predefinita (che dovrebbe essere uguale size) può essere assegnato.

Problemi correlati