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
charevita la necessità di codificare unrpad()espressione. Ad esempio, sefirstnameelastnamesono 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 uncharvalue attiverà il suo comportamento di riempimento vuoto mentrenullnon 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.