¿Cómo diferenciar VARCHAR2 en Oracle Data Base?

Es importante, diferenciar el uso de VARCHAR2 (n byte o char). A continuación, conoceremos qué es VARCHAR2 en Oracle Data Base.

Para diferenciar las dos cadenas de caracteres, hay que tener en cuenta que VARCHAR2 (byte) delimita en bytes mientras que VARCHAR2 (char) delimita el número de caracteres.

Aun así, se podría gestionar mejor los bytes de almacenamiento, usando NVARCHAR2, ya que su función es la misma que la de VARCHAR2 (10 CHAR).

Según el juego de caracteres usada en la base de datos, por ejemplo, AL32UTF8 los caracteres pueden ser de hasta 4 byte. Cosa que no pasa en WE8MSWIN1252 ya que en este caso todos los caracteres eran de un solo byte y no requiere almacenamiento multibyte.

Según el caso, cambiarían los bytes almacenados, dándonos un menor o mayor espacio, si por ejemplo, son caracteres de la zona de Asia.

En ese caso, mejor usar NVARCHAR2 antes que VARCHAR2 (n CHAR) y así será menor los bytes almacenados en la base de datos.

Usar NVARCHAR2 es mejor que VARCHAR2 (n CHAR) solo en el caso de que se vaya a usar la base de datos con caracteres asiáticos.

Es conveniente usar siempre el tipo de datos VARCHAR2 para almacenar cadenas de caracteres de longitud variable. Los cuales son todos aquellos caracteres que pueden ser de más de un byte de longitud.

Si la base de datos se ejecuta en un conjunto de caracteres de un solo byte (por ejemplo, US7ASCII, WE8MSWIN1252 o WE8ISO8859P1).

No importa si se usa VARCHAR2 (BYTE) o VARCHAR2 (CHAR) porque los caracteres en estos son de un solo byte y la cantidad delimitada en ambos casos sería la misma.

Solo hace una diferencia cuando la base de datos se ejecuta en un conjunto de caracteres de varios bytes (por ejemplo, AL32UTF8 o AL16UTF16).

Simplemente puede verse 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)

Podemos apreciar que al insertar un carácter multibyte en un solo byte, nos dará el error de falta de espacio usando VARCHAR2 (1 BYTE) pero al insertarlo en VARCHAR2 (1 CHAR), nos dejara guardar el carácter que queramos sin importar su peso en byte, ya que en el caso de Unicode podrían ser de hasta 4 bytes.

  DMU, asistente de migración Oracle para Unicode

Sin embargo, VARCHAR2 (4000 CHAR) no significa que tenga la garantía de almacenar hasta 4000 caracteres. El límite sigue siendo de 4000 bytes, por lo que en el peor de los casos puede almacenar solo hasta 1000 caracteres en dicho campo.

Además, después de la versión 12c, el máximo para varchar2 ahora es 32767 byte solo si el parámetro de inicialización «MAX_STRING_SIZE» está en «EXTENDED», en el caso de no ser así, el máximo por defecto seguiría siendo de 4000 byte.

Si se necesita más que eso, sería conveniente usar una cadena de caracteres CLOB que nos daría un límite de bytes mayor.

En el PL/SQL, los bytes almacenados de las ambas formas, ya sea VARCHAR2 (n byte) o VARCHAR2 (n char) se guardaran usando los mismos bytes por carácter.

Acorde a esta información si sabemos exactamente la cantidad de bytes que serán almacenados, la mejor forma de guardarlos sería usando VARCHAR2 (n byte).

Sabiendo que siempre serán los mismos caracteres ya que al usar otros podría verse afectado el máximo de bytes de no saber cuántos byte van a ocupar esos caracteres y queremos delimitarlos en cantidad de caracteres, será más apropiado usar VARCHAR2 (n char).

Si te ha sido útil puedes leer mas entradas sobre bases de datos en nuestra web.

4/5 - (4 votos)

Deja una respuesta