Diferenças Importantes entre os Tipos CHAR e VARCHAR2 do Oracle

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (2)  (0)

Este artigo aborda algumas diferenças semânticas importantes que existem entre os tipos CHAR e VARCHAR2.

1. Introdução


            Este artigo aborda algumas diferenças semânticas importantes que existem entre os tipos CHAR e VARCHAR2.

 

2. A Questão dos Espaços em Branco

           

Quando um valor é atribuído a uma variável do tipo CHAR e este valor é menor do que o tamanho máximo da variável, o Oracle completa a variável automaticamente com espaços em branco no final.  No exemplo abaixo, a variável v1 será completada com 4 espaços em branco no final, pois é do tipo CHAR, com tamanho 10 e está recebendo como valor uma string com 6 caracteres. Independentemente  de  seu  valor ela ocupará sempre 10 bytes em memória.

 

            v1  CHAR(10) := 'Platão'; 

 

De maneira oposta, se a variável é do tipo VARCHAR2 e recebe um valor que é menor do que o seu tamanho máximo, o Oracle não irá completá-la com espaços em branco. A variável v2, ilustrada abaixo, ocupará 6 bytes em memória.

 

            v2  VARCHAR2(10) := 'Platão'; 

 

Você precisa ter muito cuidado todas as vezes que precisar comparar um valor armazenado em uma variável CHAR com o valor armazenado em uma variável VARCHAR2. Esse cuidado é necessário tanto em consultas SQL como em avaliações lógicas de programas PL/SQL. Para que o conceito fique claro, digite e execute o programa PL/SQL apresentado a seguir.

 

EXEMPLO 1  – Diferenças entre os tipos CHAR e VARCHAR2 (Programa PL/SQL)

CREATE OR REPLACE PROCEDURE p_compara_strings IS

/* -----------------------------------------------------------
   PROCEDURE : p_comp_strings
   DESCRIÇÃO : mostra as diferenças entres os tipos CHAR e VARCHAR2
   ----------------------------------------------------------- */

v1    CHAR(10)      := 'Platão';
v2    VARCHAR2(10)  := 'Platão';
v3    VARCHAR2(4000):= 'Platão';

BEGIN

   /* comparação de v1 com v2 */

   IF (v1 = v2) THEN -- resultará em FALSE.
     DBMS_OUTPUT.PUT_LINE('v1 é igual a v2');
   ELSE
     DBMS_OUTPUT.PUT_LINE('v1 é diferente de v2');
   END IF;

    /* comparação de v2 com v3 */
 
  IF (v2 = v3) THEN -- resultará em TRUE.
     DBMS_OUTPUT.PUT_LINE('v2 é igual a v3');
   ELSE
     DBMS_OUTPUT.PUT_LINE('v2 é diferente de v3');
   END IF;

END p_compara_strings;
/


A execução do programa gera o seguinte resultado:


SQL> exec p_compara_strings;

v1 é diferente de v2
v2 é igual a v3

Procedimento PL/SQL concluído com sucesso.

SQL>

            Veja que para o Oracle “v1” e “v2” têm conteúdo diferente, pois “v1” é do tipo CHAR e por isso é armazenada com espaços em branco no final.  Uma possível solução para o problema é você aplicar sempre a função TRIM - que remove espaços em branco de uma string - quando realizar a comparação de uma variável CHAR com VARCHAR2.
 

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?