Qual è la principale differenza tra Varchar2 e char

Creazione della tabella:

CREATE TABLE test ( charcol CHAR(10), varcharcol VARCHAR2(10)); SELECT LENGTH(charcol), LENGTH(varcharcol) FROM test; 

Risultato:

 LENGTH(CHARCOL) LENGTH(VARCHARCOL) --------------- ------------------ 10 1 

Per favore fatemi sapere qual è la differenza tra Varchar2 e char? A che ora usiamo entrambi?

Semplice esempio per mostrare la differenza:

 SELECT '"'||CAST('abc' AS VARCHAR2(10))||'"', '"'||CAST('abc' AS CHAR(10))||'"' FROM dual; '"'||CAST('ABC'ASVARCHAR2(10))||'"' '"'||CAST('ABC'ASCHAR(10))||'"' ----------------------------------- ------------------------------- "abc" "abc " 1 row selected. 

Il CHAR è utile per le espressioni in cui la lunghezza dei caratteri è sempre fissa, ad esempio il codice postale per gli stati degli Stati Uniti, ad esempio CA, NY, FL, TX

Questo è un thread vecchio, ma è appena arrivato in cima a una ricerca su Google per ‘Oracle char vs varchar2’ , e mentre ci sono già diverse risposte che descrivono correttamente il comportamento di char , penso che sia necessario dire che non si dovrebbe usare tranne in due situazioni specifiche:

  1. Si sta creando un file o report a lunghezza fissa e l’assegnazione di un valore non null a un char evita la necessità di codificare rpad() . Ad esempio, se firstname e lastname sono entrambi definiti come char(20) , quindi firstname || lastname firstname || lastname è un modo più breve per scrivere rpad(firstname,20) || rpad(lastname,20) rpad(firstname,20) || rpad(lastname,20) .
  2. È necessario distinguere tra la stringa vuota esplicita '' e null . Normalmente sono la stessa cosa in Oracle, ma l’assegnazione di '' a un valore char attiverà il suo comportamento di riempimento vuoto mentre null non lo farà, quindi se è importante dire la differenza, e non riesco a pensare veramente a un motivo per cui sarebbe, quindi hai un modo per farlo.

Non c’è davvero alcun motivo per usare char solo perché è stata riparata una certa lunghezza (ad esempio una bandiera Y/N o un codice valuta ISO come 'USD' ). Non è più efficiente, non risparmia spazio (non esiste un indicatore di lunghezza mitico per un varchar2 , c’è solo un overhead vuoto per char ), e non impedisce a nessuno di inserire valori più brevi. (Se inserisci 'ZZ' nella colonna di valuta char(3) , verrà semplicemente memorizzato come 'ZZ ' .) Non è nemmeno compatibile con versioni precedenti di Oracle che una volta si basava su di esso, perché non ce n’era mai uno .

E il contagio può diffondersi, poiché (seguendo le migliori pratiche) è ansible ancorare una dichiarazione di variabile usando qualcosa come sales.currency%type . Ora la tua variabile l_sale_currency è un char invisibile che diventa invisibilmente vuoto per valori più brevi (o '' ), aprendo la porta per oscurare i bug dove l_sale_currency non è uguale a l_refund_currency anche se hai assegnato 'ZZ' a entrambi.

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

Il tipo CHAR ha dimensioni fisse, quindi se si dice che è 10 byte, memorizza sempre 10 byte nel database e non importa se si memorizza un testo o solo 10 byte vuoti

La dimensione di VARCHAR2 dipende dal numero di byte che si stanno effettivamente memorizzando nel database. Il numero specificato è solo il numero massimo di byte che è ansible memorizzare (sebbene 1 byte sia minimo)

È necessario utilizzare CHAR quando si gestiscono stringhe di lunghezza fissa (si conosce in anticipo la lunghezza esatta della stringa che verrà memorizzata) – il database può quindi manipolarlo meglio e più velocemente poiché conosce la lunghezza esatta

Dovresti usare VARCHAR2 quando non conosci la lunghezza esatta delle stringhe memorizzate.

La situazione che useresti entrambe potrebbe essere:

 name VARCHAR2(255), zip_code CHAR(5) --if your users have only 5 place zip codes 

CHAR

CHAR dovrebbe essere usato per memorizzare stringhe di caratteri a lunghezza fissa. I valori stringa saranno spazio / spazio vuoto prima di essere memorizzati sul disco. Se questo tipo viene utilizzato per memorizzare stringhe di lunghezza varibale, sprecherà molto spazio su disco.

VARCHAR2

VARCHAR2 è usato per memorizzare stringhe di caratteri di lunghezza variabile. La lunghezza del valore stringa verrà memorizzata su disco con il valore stesso.

E

 At what times we use both? 

Tutto dipende dalle tue esigenze.

Giusto per evitare confusione su molte informazioni sbagliate. Ecco alcune informazioni sulla differenza tra cui le prestazioni

Riferimento: https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::1111_QUESTION_ID:2668391900346844476

Dal momento che un char non è altro che un VARCHAR2 che è vuoto riempito alla lunghezza massima – cioè, la differenza tra le colonne X e Y sotto:

creare tabella t (x varchar2 (30), y char (30)); inserire in valori t (x, y) (rpad (‘a’, ”, 30), ‘a’);

È ASSOLUTAMENTE NULLA, e dato che la differenza tra le colonne X e Y sotto:

inserisci nei valori t (x, y) (‘a’, ‘a’)

è che X consuma 3 byte (indicatore null, lunghezza byte iniziale, 1 byte per ‘a’) e Y consuma 32 byte (indicatore null, lunghezza byte iniziale, 30 byte per ‘a’)

Umm, varchar2 sarà un po ‘”a un vantaggio dal punto di vista delle prestazioni”. Ci aiuta NON A TUTTI che char (30) è sempre 30 byte – per noi, è semplicemente un varchar2 che è vuoto riempito alla lunghezza massima. Ci aiuta nell’elaborazione – ZERO, zilch, zippo.

Ogni volta che vedi qualcuno dire “è fino al 50% più veloce”, e questo è tutto – nessun esempio, nessuna scienza, nessun fatto, nessuna storia per sostenerlo – basta ridere forte a loro e continuare a muoversi insieme.

Ci sono altre “cose ​​inventate” anche su quella pagina, ad esempio:

“La ricerca è più veloce in CHAR poiché tutte le stringhe sono memorizzate in una posizione specifica l’una dall’altra, il sistema non deve cercare la fine della stringa, mentre in VARCHAR il sistema deve prima trovare la fine della stringa e poi andare per la ricerca.”

FALSE: un char è solo un vuoto varchar2 – non memorizziamo le stringhe “in una posizione specificata l’una dall’altra”. Cerchiamo la fine della stringa – usiamo una lunghezza di byte iniziale per capire le cose.

CHAR viene utilizzato per memorizzare stringhe di caratteri a lunghezza fissa. Sprecherà molto spazio su disco se questo tipo viene usato per memorizzare stringhe di lunghezza varibale.

VARCHAR2 è usato per memorizzare stringhe di caratteri di lunghezza variabile.

A che ora usiamo entrambi?

Questo può variare e dipendere dal tuo requisito.

MODIFICARE:-

Lo capisco con un esempio, se hai una colonna di nome studente con dimensione 10; sname CHAR(10) e Se viene inserito un valore di colonna 'RAMA' , 6 spazi vuoti verranno inseriti a destra del valore. Se questa fosse una colonna VARCHAR; sname VARCHAR2(10). Allora Varchar prenderà 4 spazi su 10 possibili e libererà i successivi 6 per altri usi.