Oracle
 sql >> Database >  >> RDS >> Oracle

Qual è la principale differenza tra Varchar2 e char

Sebbene ci siano già diverse risposte che descrivono correttamente il comportamento di char , penso che sia necessario dire che non dovresti usarlo tranne che in tre situazioni specifiche:

  1. Stai creando un file o un rapporto di lunghezza fissa e stai assegnando un valore non nullo a un char evita la necessità di codificare un rpad() espressione. Ad esempio, se firstname e lastname sono entrambi definiti come char(20) , quindi firstname || lastname è un modo più breve per scrivere rpad(firstname,20) || rpad(lastname,20) per creare Chuck Norris .
  2. Devi distinguere tra la stringa vuota esplicita '' e null . Normalmente sono la stessa cosa in Oracle, ma assegnano '' a un char value attiverà il suo comportamento di riempimento vuoto mentre null non lo farà, quindi se è importante dire la differenza e non riesco davvero a pensare a un motivo per cui lo sarebbe, allora hai un modo per farlo.
  3. Il tuo codice è stato trasferito da (o deve essere compatibile con) qualche altro sistema che richiede spazi vuoti per motivi legacy. In tal caso sei bloccato con esso e hai la mia simpatia.

Non c'è davvero nessun motivo per usare char solo perché una certa lunghezza è fissa (ad esempio un Y/N flag o un codice valuta ISO come 'USD' ). Non è più efficiente, non fa risparmiare spazio (non esiste un indicatore di lunghezza mitico per un varchar2 , c'è solo un sovraccarico di riempimento vuoto per char ), e non impedisce a nessuno di immettere valori più brevi. (Se inserisci 'ZZ' nel tuo char(3) colonna valuta, verrà semplicemente memorizzato come 'ZZ ' .) Non è nemmeno compatibile con le versioni precedenti di Oracle che un tempo si basava su di esso, perché non ce n'è mai stato uno.

E il contagio può diffondersi, poiché (seguendo la migliore pratica) potresti ancorare una dichiarazione di variabile utilizzando qualcosa come sales.currency%type . Ora il tuo l_sale_currency la variabile è un char invisibile che verrà riempito in modo invisibile per valori più brevi (o '' ), aprendo la porta per oscurare i bug in cui l_sale_currency non è uguale a l_refund_currency anche se hai assegnato 'ZZ' ad entrambi.

Alcuni sostengono che char(n) (dove n è una lunghezza di caratteri) indica che i valori dovrebbero essere n caratteri lunghi, e questa è una forma di auto-documentazione. Ma sicuramente se prendi sul serio un formato a 3 caratteri (codici paese ISO-Alpha-3 anziché ISO-Alpha-2, ad esempio), non definiresti un vincolo per far rispettare la regola, piuttosto che lasciare che gli sviluppatori guardino un char(3) tipo di dati e trarre le proprie conclusioni?

CHAR è stato introdotto in Oracle 6 per, sono sicuro, motivi di compatibilità ANSI. Probabilmente ci sono potenziali clienti che decidono quale prodotto di database acquistare e compatibilità ANSI è nella loro lista di controllo (o era allora) e CHAR con blank-padding è definito nello standard ANSI, quindi Oracle deve fornirlo. Non dovresti effettivamente usarlo.