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=EXTENDED
VARCHAR2(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
fonte
2015-06-16 17:19:39
possibile duplicato (http://stackoverflow.com/questions/1171196/what-is-the-difference-between-varchar-and-varchar2) –
e possibile duplicato di http://stackoverflow.com/questions/81448/difference-between-byte-and-char-in-column-datates –
vedere anche il parametro NLS_LENGTH_SEMANTICS: https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::1111_QUESTION_ID:29518831139714 – ibre5041