Solución:
Puede declarar columnas / variables como varchar2 (n CHAR) y varchar2 (n byte).
n CHAR significa que la variable contendrá n caracteres. En los conjuntos de caracteres de varios bytes, no siempre sabe cuántos bytes desea almacenar, pero desea garantizar el almacenamiento de una cierta cantidad de caracteres.
n bytes significa simplemente el número de bytes que desea almacenar.
varchar está en desuso. No lo uses. ¿Cuál es la diferencia entre varchar y varchar2?
los VARCHAR
tipo de datos es sinónimo de VARCHAR2
tipo de datos. Para evitar posibles cambios de comportamiento, utilice siempre el VARCHAR2
tipo de datos para almacenar cadenas de caracteres de longitud variable.
Si su base de datos se ejecuta en un juego de caracteres de un solo byte (p. Ej. US7ASCII
, WE8MSWIN1252
o WE8ISO8859P1
) no importa si usa VARCHAR2(x BYTE)
o VARCHAR2(x CHAR)
.
Solo hace una diferencia cuando su base de datos se ejecuta en un conjunto de caracteres de varios bytes (por ejemplo, AL32UTF8
o AL16UTF16
). Simplemente puede verlo en este ejemplo:
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 que puede almacenar hasta 1 carácter, sin importar cuántos bytes tenga. En el caso de Unicode, un carácter puede ocupar hasta 4 bytes.
VARCHAR2(1 BYTE)
significa que puede almacenar un carácter que ocupa máx. 1 byte.
Si no especifica ninguno BYTE
o CHAR
entonces el valor predeterminado se toma de NLS_LENGTH_SEMANTICS
parámetro de sesión.
A menos que tenga Oracle 12c donde puede configurar MAX_STRING_SIZE=EXTENDED
el límite es VARCHAR2(4000 CHAR)
Sin embargo, VARCHAR2(4000 CHAR)
no significa que tenga la garantía de almacenar hasta 4000 caracteres. El límite sigue siendo 4000 bytes, por lo que, en el peor de los casos, puede almacenar solo hasta 1000 caracteres en dicho campo.
Vea este ejemplo (€
en UTF-8 ocupa 3 bytes):
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
Ver también Ejemplos y límites del uso de la semántica BYTE y CHAR (NLS_LENGTH_SEMANTICS) (Doc ID 144808.1)
Para responder a su primera pregunta:
Sí, significa que se asigna 1 byte para 1 carácter. Mira este ejemplo
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>
Y para responder a la siguiente: La diferencia entre varchar2
y varchar
:
-
VARCHAR
puede almacenar hasta2000 bytes
de personajes mientrasVARCHAR2
puede almacenar hasta4000 bytes
de personajes. - Si declaramos el tipo de datos como
VARCHAR
entonces ocupará espacio paraNULL values
, En caso deVARCHAR2
tipo de datos lo haránot
ocupar cualquier espacio.