A Diferença entre CHAR, VARCHAR e VARCHAR2

Oracle tem três tipos de dados para armazenar as cordas. – CHAR, VARCHAR e VARCHAR2. Como eles diferem um do outro? Quando deve usar qual?

Vamos descobrir as respostas neste artigo.

A coisa mais simples fora do caminho primeiro: VARCHAR e VARCHAR2 são a mesma coisa. Mas que isto hoje – isto pode mudar. Dê uma olhada na documentação do Oracle 10G Release 2:

Não use o tipo de dados VARCHAR. Em vez disso, use a opção VARCHAR2 datatype. Embora o VARCHAR datatype seja atualmente sinônimo de VARCHAR2, o VARCHAR datatype está programado para ser redefinido como um datatype separado usado para cadeias de caracteres de comprimento variável em comparação com a semântica de comparação diferente.

Neste artigo, VARCHAR2 é usado para significar tanto VARCHAR como VARCHAR2 como eles são equivalentes hoje.

Como CHAR e VARCHAR2 são diferentes então?

A diferença é que CHAR(n) SEMPRE terá n bytes de comprimento. Se o comprimento da string for <n, será almofadado em branco ao inserir para garantir um comprimento de n. Um VARCHAR2(n), por outro lado, terá 1 a n bytes de comprimento. Uma string mais curta armazenada como VARCHAR2 NÃO ficará em branco acolchoada.

Por exemplo, suponha que você armazene a string ‘ORATABLE’ em um campo CHAR(20) e um campo VARCHAR2(20). O campo CHAR usará 22 bytes (2 bytes para o comprimento principal). O campo VARCHAR2 usará apenas 10 bytes (8 para a string, 2 bytes para o comprimento principal).

Para resumir, CHAR é VARCHAR2 almofadado ao seu comprimento máximo.

Como essa diferença afeta SQLs?

Isso muda a maneira como as strings são combinadas em CHAR vs VARCHAR2. Verifique em action:

SQL> create table strings 2 (colchar char (20) 3 , colvarchar varchar2 (20));Table created.SQL>SQL> insert into strings 2 (colchar, colvarchar) 3 values 4 ('ORATABLE', 'ORATABLE');1 row created.SQL> -- Define a string variableSQL> var str varchar2(20)SQL> -- Give it a value with length < 20SQL> exec :str := 'ORATABLE'PL/SQL procedure successfully completed.SQL> -- Exact string match with CHARSQL> -- No result found!SQL> select 'found' found_flag 2 from strings 3 where colchar = :str;no rows selectedSQL> -- Padded string match with CHARSQL> -- Now it finds itSQL> select 'found' found_flag 2 from strings 3 where colchar = rpad(:str,20);FOUND-----found

Então você vê, o preenchimento com espaços em branco faz diferença se a string CHAR é igualada com um parâmetro de comprimento variável. Para obter uma correspondência, você precisa ou rpad o valor ou rtrim a coluna.

Não há tal requisito com VARCHAR2:

SQL> -- Exact string match with VARCHAR2SQL> -- Result found!SQL> select 'found' found_flag 2 from strings 3 where colvarchar = :str;FOUND-----found

Quando devemos usar CHAR, quando VARCHAR2?

Se você só usar VARCHAR2 e ignorar CHAR, você vai tornar a vida muito mais simples. Não há diferença entre os dois, exceto que CHAR consome mais espaço quando suas cordas nem sempre têm o comprimento máximo fixado. Além disso, CHAR leva a mais confusão nas consultas de escrita.

Utilizo CHAR como colunas de banco de dados somente para S/N tipo de valores. (Não há BOOLEAN datatype de coluna, lembra-se?) Isto age como um marcador para uma coluna do tipo “flag” ou “switch” – mas poderia igualmente ter sido VARCHAR2.

Para todas as outras seqüências de caracteres, é VARCHAR2.

Sumário

Ao considerar os tipos de dados Oracle CHAR, VARCHAR e VARCHAR2, lembre-se que:

  • VARCHAR e VARCHAR2 são a mesma coisa, mas a função de VARCHAR pode mudar no futuro. Use VARCHAR2.
  • CHAR e VARCHAR2 são diferentes em que CHAR blocos em branco suas cordas para ser do seu comprimento máximo. VARCHAR2 não faz almofadas em branco.
  • Por causa do acima, consultas que envolvem comparação de cordas numa coluna CHAR requerem mais cuidado – uma VARCHAR2 comparada com CHAR precisa de ser rpad-ded para obter um acerto.
  • É preciso repetir: use VARCHAR2!

Deixe uma resposta

O seu endereço de email não será publicado.