2015-06-16 48 views
6

Non sono così in database e ho il seguente dubbio.Che cosa significa esattamente che la dimensione di un campo VARCHAR2 è dichiarata come 1 BYTE? (in un DB Oracle)

So che posso dichiarare un campo varchar2 utilizzando il numero del carattere che può contenere.

Ma in un database Oracle su cui sto lavorando su Ho trovato che un campo (denominato PDF) è diefined come:

VARCHAR2(1 BYTE) 

Che cosa significa esattamente? Quanti caratteri contiene?

Un altro dubbio è: che cosa è esattamente la differenza tra un VARCHAR fild e un VARCHAR2 campo ?

Tnx

+0

possibile duplicato (http://stackoverflow.com/questions/1171196/what-is-the-difference-between-varchar-and-varchar2) –

+1

e possibile duplicato di http://stackoverflow.com/questions/81448/difference-between-byte-and-char-in-column-datates –

+0

vedere anche il parametro NLS_LENGTH_SEMANTICS: https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::1111_QUESTION_ID:29518831139714 – ibre5041

risposta

9

È possibile dichiarare colonne/variabili come varchar2 (n CHAR) e varchar2 (n byte).

n CHAR indica che la variabile manterrà n caratteri. Nei set di caratteri multi byte non si sa sempre quanti byte si desidera memorizzare, ma si vuole garantire l'archiviazione di una certa quantità di caratteri.

n byte indica semplicemente il numero di byte che si desidera memorizzare.

varchar è obsoleto. Non usarlo. What is the difference between varchar and varchar2?

+0

Probabilmente storico. All'inizio un personaggio era un byte. Quindi i caratteri multi-byte dove sono stati introdotti e il significato della lunghezza è stato improvvisamente aperto a più interpretazioni. – Rene

+0

Trovo strano che quando si dichiara un tipo di dati per memorizzare caratteri di testo, viene data la possibilità di specificare il numero di byte di memoria. La dimensione di archiviazione sottostante deve essere gestita in modo trasparente dal motore di database in base alla codifica di testo corrispondente. Se ad esempio, come utente ho bisogno di memorizzare il numero X di caratteri di testo usando la codifica UTF-8, un motore DB deve capire internamente quanta memoria è necessaria per quello. Lasciando un utente che sta aprendo la porta per problemi. – cvacca

+0

C'è un parametro del database NLS_LENGTH_SEMANTICS che si occupa di questo. – Rene

0

allocazione di memoria massima in SQL.

VARCHAR : 4000 BYTE 
VARCHAR2 : 4000 BYTE 

Ora, quando si dichiara VARCHAR2(1 BYTE) o VARCHAR2(1). Ciò significa che può memorizzare fino a 1 carattere.

Read more

+0

domanda lato destro .. nel blocco plsql posso assegnare massimo varchar2 (36000) .. per quanto riguarda varchar? qual è il massimo? Sono d'accordo che è deprecato – Moudiz

+0

In Oracle '12c', è possibile estendere ** VARCHAR2 ** a' 32767' per ** Tipo di dati SQL **.Devi impostare "MAX_STRING_SIZE" su "EXTENDED". –

+0

BYTE è diverso da CHAR tranne per i set di caratteri semplici. –

3

di rispondervi prima domanda:
Sì, significa che 1 byte alloca per 1 carattere. Guarda questo esempio

SQL> conn/as sysdba 
Connected. 
SQL> create table test (id number(10), v_char varchar2(10)); 

Table created. 

SQL> insert into test values(11111111111,'darshan'); 
insert into test values(11111111111,'darshan') 
* 
ERROR at line 1: 
ORA-01438: value larger than specified precision allows for this column 


SQL> insert into test values(11111,'darshandarsh'); 
insert into test values(11111,'darshandarsh') 
* 
ERROR at line 1: 
ORA-12899: value too large for column "SYS"."TEST"."V_CHAR" (actual: 12, 
maximum: 10) 


SQL> insert into test values(111,'Darshan'); 

1 row created. 

SQL> 

E per rispondere alla tua prossima: La differenza tra varchar2 e varchar:

  1. VARCHAR può memorizzare fino a 2000 bytes di caratteri, mentre VARCHAR2 può memorizzare fino a 4000 bytes di caratteri.
  2. Se si dichiara un tipo di dati come VARCHAR, occuperà lo spazio per NULL values, in caso di tipo di dati VARCHAR2 occuperà uno spazio qualsiasi nel formato not.
2

significa solo byte sarà assegnato per carattere - quindi se si sta utilizzando i set di caratteri multi-byte, il tuo personaggio 1 non si adatta

se sai che devi avere almeno abbastanza spazio per 1 carattere, non utilizzare la sintassi bYTE se non si sa esattamente quanto spazio sarà necessario memorizzare tale byte

in caso di dubbio, utilizzare VARCHAR2 (1 carattere)

stessa cosa ha risposto qui Difference between BYTE and CHAR in column datatypes

Inoltre 12c il massimo per varchar2 è ora 32k, non 4000. Se avete bisogno di più di questo, utilizzare CLOB

in Oracle, non utilizzare VARCHAR

+1

* Inoltre, in 12c il massimo per varchar2 ora è 32k, non 4000. * Sì, ma deve essere impostato esplicitamente al livello 'SYSTEM' facendo' MAX_STRING_SIZE' su 'EXTENDED', altrimenti per impostazione predefinita sarebbe' 4000 '. –

+0

Grazie per l'assistenza + Lalit – thatjeffsmith

+0

Funziona anche per set di caratteri multibyte, purché il carattere utilizzi solo un byte, ad es. fino a 'CHR (127)' in UTF-8 –

5

non so la differenza esatta tra VARCHAR e VARCHAR2 ma la risposta è semplice: non utilizzare VARCHAR, utilizzare solo VARCHAR2.

Se il database viene eseguito su un set di caratteri a singolo byte (ad esempio US7ASCII, WE8MSWIN1252 o WE8ISO8859P1) esso non fa alcuna differenza se si utilizza VARCHAR2(x BYTE) o VARCHAR2(1 CHAR).

Fa una differenza quando il DB viene eseguito su un set di caratteri multibyte (ad esempio AL32UTF8 o AL16UTF16). Si può semplicemente vederlo in questo esempio:

CREATE TABLE my_table (
    VARCHAR2_byte VARCHAR2(1 BYTE), 
    VARCHAR2_char VARCHAR2(1 CHAR) 
); 

INSERT INTO my_table (VARCHAR2_char) VALUES ('€'); 
1 row created. 

INSERT INTO my_table (VARCHAR2_char) VALUES ('ü'); 
1 row created. 

INSERT INTO my_table (VARCHAR2_byte) VALUES ('€'); 
INSERT INTO my_table (VARCHAR2_byte) VALUES ('€') 
Error at line 10 
ORA-12899: value too large for column "MY_TABLE"."VARCHAR2_BYTE" (actual: 3, maximum: 1) 

INSERT INTO my_table (VARCHAR2_byte) VALUES ('ü') 
Error at line 11 
ORA-12899: value too large for column "MY_TABLE"."VARCHAR2_BYTE" (actual: 2, maximum: 1) 

VARCHAR2(1 CHAR) significa che è possibile memorizzare fino a 1 carattere, indipendentemente dal numero di byte che ha. In caso di Unicode un personaggio può occupare fino a 4 byte.

VARCHAR2(1 BYTE) significa che è possibile memorizzare un carattere che occupa max. 1 byte.

A meno che non si dispone di Oracle 12c in cui è possibile impostare il limite è MAX_STRING_SIZE=EXTENDEDVARCHAR2(4000 CHAR)

Tuttavia, VARCHAR2(4000 CHAR) non significa che sono garantiti per memorizzare fino a 4000 caratteri. Il limite è ancora 4000 byte, quindi nel peggiore dei casi è possibile memorizzare solo fino a 1000 caratteri in tale campo.

Vedere questo esempio ( in UTF-8 occupa 3 byte): [? Qual è la differenza tra varchar e varchar2]

CREATE TABLE my_table2(VARCHAR2_char VARCHAR2(4000 CHAR)); 

BEGIN 
    INSERT INTO my_table2 VALUES ('€€€€€€€€€€'); 
    FOR i IN 1..7 LOOP 
     UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char; 
    END LOOP; 
END; 
/

SELECT LENGTHB(VARCHAR2_char) , LENGTHC(VARCHAR2_char) FROM my_table2; 

LENGTHB(VARCHAR2_CHAR) LENGTHC(VARCHAR2_CHAR) 
---------------------- ---------------------- 
        3840     1280 
1 row selected. 


UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char; 

UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char 
Error at line 1 
ORA-01489: result of string concatenation is too long