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.


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 v2v2 é igual a v3
Procedimento PL/SQL concluído com sucesso.
SQL>              
Listagem 1. Diferenças entre os tipos CHAR e VARCHAR2 (Programa PL/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.