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çãoVARCHAR2
datatype. Embora oVARCHAR
datatype seja atualmente sinônimo deVARCHAR2
, oVARCHAR
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!