Saltar al contenido

¿Qué significa cuando el tamaño de un VARCHAR2 en Oracle se declara como 1 byte?

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 :

  1. VARCHAR puede almacenar hasta 2000 bytes de personajes mientras VARCHAR2 puede almacenar hasta 4000 bytes de personajes.
  2. Si declaramos el tipo de datos como VARCHAR entonces ocupará espacio para NULL values, En caso de VARCHAR2 tipo de datos lo hará not ocupar cualquier espacio.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *