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:
- 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 unrpad()
espressione. Ad esempio, sefirstname
elastname
sono entrambi definiti comechar(20)
, quindifirstname || lastname
è un modo più breve per scrivererpad(firstname,20) || rpad(lastname,20)
per creareChuck Norris
. - Devi distinguere tra la stringa vuota esplicita
''
enull
. Normalmente sono la stessa cosa in Oracle, ma assegnano''
a unchar
value attiverà il suo comportamento di riempimento vuoto mentrenull
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. - 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.