Oracle tem vários tipos de dados de caracteres que são comumente usados e também podem ser confusos se você não souber as diferenças entre eles. Saiba quais são e as diferenças entre eles neste artigo.
Os tipos de dados de caracteres Oracle que são usados com mais frequência são CHAR e VARCHAR2. Há também um tipo de dados VARCHAR.
Vejamos quais são cada um desses tipos de dados.
CHAR Datatype
O tipo de dados CHAR armazena valores de caracteres. Ele armazena esses valores como uma string de comprimento fixo.
Isso significa que os valores da string serão acolchoados, ou terão caracteres de espaço adicionados a eles, para serem armazenados no banco de dados.
O comprimento máximo de um valor CHAR é de 2000 bytes.
Vejamos um exemplo disto.
Criarei uma tabela de exemplo usando todos estes três tipos de dados, insira alguns dados, e veja o que mostra.
CREATE TABLE chartest ( char_column CHAR(10), varchar_column VARCHAR(10), varchar2_column VARCHAR2(10));
Agora, vamos inserir um valor.
INSERT INTO chartest (char_column)VALUES ('abcde');
Agora, vamos consultar o valor. Vou consultar o valor, e o valor entre parênteses (para ver onde estão os espaços), verificar o comprimento, e depois executar um DUMP sobre ele para ver algumas estatísticas.
SELECT char_column,'(' || char_column || ')' AS col_full,LENGTH(char_column) AS col_length,DUMP(char_column) AS col_dumpFROM chartest;
Resultado:
CHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
abcde | (abcde ) | 10 | Tip=96 Len=10: 97,98,99,100,101,32,32,32,32,32 |
Como se pode ver, o valor da abcde foi almofadado com espaços quando armazenado para o levar até um comprimento de 10. Na saída da função DUMP, você pode ver os códigos para cada caractere que está armazenado. O caracter 32 é um espaço.
VARCHAR Datatype
O VARCHAR datatype é um tipo de dado padrão ANSI, razão pela qual está incluído no Oracle.
No entanto, no momento, é o mesmo que o tipo de dado VARCHAR2.
Foi incluído no Oracle para permitir uma distinção entre NULL e strings vazias, que é o que VARCHAR deve fazer, de acordo com o padrão ANSI. No entanto, no Oracle, ele não faz isso. Funciona como um VARCHAR2 onde as strings vazias são tratadas como valores NULL.
Então, no Oracle, a diferença entre VARCHAR e VARCHAR2 não é nada. Eles são os mesmos.
Você não deve usar o tipo de dados VARCHAR, pois ele está reservado para futuras funcionalidades do Oracle e poderia mudar.
Vejamos um exemplo. Vamos usar a mesma tabela de anteriormente, e inserir alguns dados.
INSERT INTO chartest (varchar_column)VALUES ('fghij');
Agora, vamos selecionar estes dados.
SELECT varchar_column,'(' || varchar_column || ')' AS col_full,LENGTH(varchar_column) AS col_length,DUMP(varchar_column) AS col_dumpFROM chartest;
Resultado:
VARCHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
fghij | (fghij) | 5 | >Tipo=1 Len=5: 102.103.104.105.106 |
Vemos que o valor entre parênteses não contém espaços, que é porque VARCHAR2 e VARCHAR não adicionam espaços (que discutirei daqui a pouco). É também um comprimento de 5 caracteres.
VARCHAR2 Tipo de dados
O tipo de dados VARCHAR2 é usado para armazenar cadeias de caracteres de comprimento variável. Isto significa que você define um tamanho máximo, e as cordas que você insere na coluna serão armazenadas conforme são fornecidas. Nenhum espaço será adicionado ao caractere, como o tipo de dado CHAR.
O comprimento máximo de um tipo de dado VARCHAR2 é de 4000 bytes. No entanto, este foi aumentado para 32.767 bytes como uma das novas funcionalidades no Oracle 12c.
Vejamos um exemplo.
INSERT INTO chartest (varchar2_column)VALUES ('klmno');
Agora, vamos consultar o resultado.
SELECT varchar2_column,'(' || varchar2_column || ')' AS col_full,LENGTH(varchar2_column) AS col_length,DUMP(varchar2_column) AS col_dumpFROM chartest;
Resultado:
VARCHAR2_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
klmno | (klmno) | 5 | >Tipo=1 Len=5: 107,108,109,110,111 |
Você pode ver que a saída é a mesma que o exemplo VARCHAR. Nenhum espaço foi adicionado, e o comprimento é o mesmo. A única diferença são os caracteres do código ASCII porque a string de entrada foi diferente.
Diferenças: CHAR vs VARCHAR vs VARCHAR2
Vamos ver as diferenças entre estes três tipos de dados.
- VARCHAR e VARCHAR2 são exactamente os mesmos. CHAR é diferente.
- CHAR tem um tamanho máximo de 2000 bytes, e VARCHAR/VARCHAR2 tem um tamanho máximo de 4000 bytes (ou 32.767 no Oracle 12c)
- CHAR não precisa de um tamanho especificado e tem um tamanho padrão de 1. Um tamanho precisa ser especificado com as colunas VARCHAR/VARCHAR2.
- CHAR irá preencher espaços à direita das cordas para corresponder ao comprimento da coluna, enquanto VARCHAR/VARCHAR2 não.
O desempenho de CHAR, VARCHAR, e VARCHAR2 é o mesmo. Não há diferença no desempenho com estes tipos de dados. CHAR não é mais rápido que VARCHAR2, e VARCHAR2 não é mais rápido que CHAR.
Tom Kyte tem um post no AskTom que explica os detalhes técnicos disso. Ele também explica que uma VARCHAR2 em branco é exactamente o mesmo que um valor CHAR.
Pense nisto por um momento.
Achumar um valor VARCHAR2 em branco é o mesmo que um valor CHAR.
Os tipos de dados são quase idênticos.
Então, qual destes tipos de dados você deve usar?
Como Tom Kyte discutiu em seu fórum e em seu livro (e eu concordo com), não há razão para nunca usar o tipo de dados CHAR. VARCHAR2 pode cobrir todas as situações em que um CHAR pode ser considerado – mesmo um CHAR(1) que é o mesmo que um VARCHAR2(1).
VARCHAR vs VARCHAR2
A diferença entre VARCHAR e VARCHAR2 no Oracle é que VARCHAR é um tipo de dados padrão ANSI que suporta uma distinção entre NULL e cordas vazias. O Oracle ainda não implementou essa distinção, portanto, no momento, VARCHAR e VARCHAR2 são a mesma coisa. É mais seguro usar VARCHAR2 porque você não quer que nenhum código se quebre se o Oracle mudar VARCHAR no futuro e seu código usar VARCHAR.