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

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.

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.

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados