B Semántica de CHAR versus VARCHAR2

Este apéndice explica las diferencias semánticas entre los tipos base CHAR y VARCHAR2. Estas diferencias sutiles pero importantes entran en juego al asignar, comparar, insertar, actualizar, seleccionar o recuperar valores de caracteres.

Este apéndice analiza los siguientes temas:

Asignar Valores de caracteres Comparar Valores de caracteres Insertar Valores de caracteres Seleccionar Valores de caracteres

Asignar Valores de caracteres

Cuando asigna un valor de carácter a una variable CHAR, si el valor es menor que la longitud declarada de la variable, PL/SQL rellena el valor con la longitud declarada. Por lo tanto, la información sobre los espacios en blanco al final se pierde. En el siguiente ejemplo, el valor asignado a last_name incluye seis espacios en blanco finales, no solo uno:

last_name CHAR(10) := 'CHEN '; -- note trailing blank

Si el valor del carácter es mayor que la longitud declarada de la variable CHAR, PL/SQL anula la asignación y genera la excepción predefinida VALUE_ERROR. PL / SQL no trunca el valor ni intenta recortar los espacios en blanco finales. Por ejemplo, dada la declaración

acronym CHAR(4);

la siguiente asignación plantea VALUE_ERROR:

acronym := 'SPCA '; -- note trailing blank

Cuando se asigna un valor de carácter a una variable VARCHAR2, si el valor es menor que la longitud declarada de la variable, PL / SQL no rellena el valor ni elimina los espacios en blanco finales. Los valores de caracteres se asignan intactos, por lo que no se pierde información. Si el valor del carácter es mayor que la longitud declarada de la variable VARCHAR2, PL/SQL anula la asignación y eleva VALUE_ERROR. PL / SQL no trunca el valor ni intenta recortar los espacios en blanco finales.

Comparación de valores de caracteres

Puede utilizar los operadores relacionales para comparar valores de caracteres para igualdad o desigualdad. Las comparaciones se basan en la secuencia de cotejo utilizada para el conjunto de caracteres de la base de datos. Un valor de carácter es mayor que otro si lo sigue en la secuencia de clasificación. Por ejemplo, dadas las declaraciones

last_name1 VARCHAR2(10) := 'COLES';last_name2 VARCHAR2(10) := 'COLEMAN';

la siguiente condición IF es verdadera:

IF last_name1 > last_name2 THEN ...

ANSI / ISO SQL requiere que los dos valores de caracteres que se comparan tengan la misma longitud. Por lo tanto, si ambos valores en una comparación tienen el tipo de datos CHAR, se utilizan semánticas de relleno en blanco. Es decir, antes de comparar valores de caracteres de longitud desigual, PL / SQL rellena el valor más corto con la longitud del valor más largo. Por ejemplo, dadas las declaraciones

last_name1 CHAR(5) := 'BELLO';last_name2 CHAR(10) := 'BELLO '; -- note trailing blanks

la siguiente condición IF es verdadera:

IF last_name1 = last_name2 THEN ...

Si cualquiera de los valores de una comparación tiene un tipo de datos VARCHAR2, se utilizan semánticas de relleno no en blanco. Es decir, al comparar valores de caracteres de longitud desigual, PL / SQL no hace ajustes y utiliza las longitudes exactas. Por ejemplo, dadas las declaraciones

last_name1 VARCHAR2(10) := 'DOW';last_name2 VARCHAR2(10) := 'DOW '; -- note trailing blanks

la siguiente condición IF es falsa:

IF last_name1 = last_name2 THEN ...

Si un valor en una comparación tiene un tipo de datos VARCHAR2 y el otro valor tiene el tipo de datos CHAR, se utilizan semánticas de relleno no en blanco. Pero, recuerde, cuando asigna un valor de carácter a una variable CHAR, si el valor es menor que la longitud declarada de la variable, PL/SQL rellena el valor a la longitud declarada. Por lo tanto, dadas las declaraciones

last_name1 VARCHAR2(10) := 'STAUB';last_name2 CHAR(10) := 'STAUB'; -- PL/SQL blank-pads value

la siguiente condición IF es falsa porque el valor de last_name2 incluye cinco espacios en blanco finales:

IF last_name1 = last_name2 THEN ...

Todos los literales de cadena tienen el tipo de datos CHAR. Por lo tanto, si ambos valores en una comparación son literales, se utilizan semánticas de relleno en blanco. Si un valor es literal, solo se usan semánticas de relleno en blanco si el otro valor tiene el tipo de datos CHAR.

Insertar valores de caracteres

Cuando inserta el valor de una variable de caracteres PL/SQL en una columna de base de datos Oracle, el hecho de que el valor esté rellenado en blanco o no depende del tipo de columna, no del tipo de variable.

Cuando inserta un valor de carácter en una columna de base de datos CHAR, Oracle no elimina los espacios en blanco finales. Si el valor es más corto que el ancho definido de la columna, Oracle rellena el valor con el ancho definido. Como resultado, se pierde información sobre los espacios en blanco finales. Si el valor del carácter es más largo que el ancho definido de la columna, Oracle anula la inserción y genera un error.

Cuando inserta un valor de carácter en una columna de base de datos VARCHAR2, Oracle no elimina los espacios en blanco finales. Si el valor es más corto que el ancho definido de la columna, Oracle no rellena el valor en blanco. Los valores de los caracteres se almacenan intactos, por lo que no se pierde información. Si el valor del carácter es más largo que el ancho definido de la columna, Oracle anula la inserción y genera un error.

Nota: Se aplican las mismas reglas al actualizar.

Al insertar valores de caracteres, para asegurarse de que no se almacenen espacios en blanco finales, utilice la función RTRIM, que recorta los espacios en blanco finales. A continuación se muestra un ejemplo:

DECLARE ... my_name VARCHAR2(15);BEGIN ... my_ename := 'LEE '; -- note trailing blanks INSERT INTO emp VALUES (my_empno, RTRIM(my_ename), ...); -- inserts 'LEE'END;

Seleccionar valores de caracteres

Cuando se selecciona un valor de una columna de base de datos Oracle en una variable de caracteres PL/SQL, si el valor está rellenado en blanco o no depende del tipo de variable, no del tipo de columna.

Cuando selecciona un valor de columna en una variable CHAR, si el valor es menor que la longitud declarada de la variable, PL/SQL blank rellena el valor a la longitud declarada. Como resultado, se pierde información sobre los espacios en blanco finales. Si el valor del carácter es mayor que la longitud declarada de la variable, PL/SQL anula la asignación y eleva VALUE_ERROR.

Cuando selecciona un valor de columna en una variable VARCHAR2, si el valor es menor que la longitud declarada de la variable, PL/SQL no rellena el valor ni elimina los espacios en blanco finales. Los valores de los caracteres se almacenan intactos, por lo que no se pierde información.

Por ejemplo, cuando selecciona un valor de columna rellenado en blanco CHAR en una variable VARCHAR2, los espacios en blanco finales no se eliminan. Si el valor del carácter es mayor que la longitud declarada de la variable VARCHAR2, PL/SQL anula la asignación y eleva VALUE_ERROR.

Nota: Se aplican las mismas reglas al buscar.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.