5.3. Tipos para caracteres

Tabela 5-4. Tipos para caracteres

Nome do tipoDescrição
character varying(n), varchar(n)comprimento variável com limite
character(n), char(n)comprimento fixo, completado com brancos
textcomprimento variável não limitado

A Tabela 5-4 mostra os tipos de propósito geral para caracteres disponíveis no PostgreSQL.

O SQL define dois tipos básicos para caracteres: character varying(n) e character(n), onde n é um número inteiro positivo. Estes dois tipos podem armazenar cadeias de caracteres com até n caracteres de comprimento. A tentativa de armazenar uma cadeia de caracteres mais longa em uma coluna de um destes tipos resulta em erro, a não ser que os caracteres excedentes sejam todos espaços. Neste caso a cadeia de caracteres será truncada em seu comprimento máximo (Esta exceção um tanto bizarra é requerida pelo padrão SQL). Se a cadeia de caracteres a ser armazenada for mais curta que o comprimento declarado, os valores do tipo character serão completados com espaço; os valores do tipo character varying simplesmente vão armazenar uma cadeia de caracteres mais curta.

Nota: Se um valor for explicitamente transformado (cast) para character varying(n) ou para character(n), então um valor com comprimento excedente será truncado para n caracteres sem ocorrência de erro (isto também é requerido pelo padrão SQL).

Nota: Antes do PostgreSQL 7.2 as cadeias de caracteres muito longas eram sempre truncadas sem a ocorrência de erro, tanto no contexto de transformação explícita quanto no de implícita.

As notações varchar(n) e char(n) são aliases para character varying(n) e character(n), respectivamente. O character sem especificação de comprimento é equivalente a character(1); se character varying for utilizado sem especificação de comprimento, este tipo aceita cadeias de caracteres de qualquer tamanho. Este último é uma extensão do PostgreSQL.

Além desses, o PostgreSQL suporta o tipo mais geral text, que armazena cadeias de caracteres de qualquer comprimento. Diferentemente de character varying, text não requer um limite superior explicitamente declarado de seu tamanho. Embora o tipo text não esteja no padrão SQL, muitos outros RDBMS também o incluem.

São requeridos para armazenar os dados destes tipos 4 bytes mais a própria cadeia de caracteres e, no caso do character, mais os espaços para completar o tamanho. As cadeias de caracteres longas são comprimidas pelo sistema automaticamente, portanto o espaço físico requerido em disco pode ser menor. Os valores longos também são armazenados em tabelas de segundo plano não interferindo, portanto, com o acesso rápido aos valores mais curtos da coluna. De qualquer forma, o tamanho possível da maior cadeia de caracteres armazenada é em torno de 1 GB (O valor máximo permitido para n na declaração do tipo de dado é menor que isto. Não seria muito útil mudar, porque nas codificações de caractere multibyte o número de caracteres e de bytes é bem diferente de qualquer modo. Se for desejado armazenar cadeias de caracteres longas, sem um limite superior especificado, deve ser utilizado text ou character varying sem a especificação de comprimento, em vez de especificar um limite de comprimento arbitrário).

Dica: Não existe diferença de desempenho entre estes três tipos, a não ser pelo aumento do tamanho do armazenamento quando é utilizado o tipo completado com brancos.

Consulte a Seção 1.1.2.1 para obter informações relativas à sintaxe das cadeia de caracteres literais, e o Capítulo 6 para obter informações relativas aos operadores e funções.

Exemplo 5-1. Utilização dos tipos caractere

CREATE TABLE teste1 (a character(4));
INSERT INTO teste1 VALUES ('ok');
SELECT a, char_length(a) FROM teste1; -- (1)
  a   | char_length
------+-------------
 ok   |           4

CREATE TABLE teste2 (b varchar(5));
INSERT INTO teste2 VALUES ('ok');
INSERT INTO teste2 VALUES ('bom       ');
INSERT INTO teste2 VALUES ('muito longo');
ERROR:  value too long for type character varying(5)
INSERT INTO teste2 VALUES ('muito longo'::varchar(5)); -- truncamento explícito
SELECT b, char_length(b) FROM teste2;
   b   | char_length
-------+-------------
 ok    |           2
 bom   |           5
 muito |           5
(1)
A função char_length é discutida na Seção 6.4.

Existem dois outros tipos para caracteres de comprimento fixo no PostgreSQL, mostrados na Tabela 5-5. O tipo name existe apenas para armazenamento dos nomes do catálogo interno, não havendo pretensão para ser de uso geral. Seu comprimento é atualmente definido como 64 bytes (63 caracteres utilizáveis mais o terminador) mas deve ser referenciado utilizando a constante NAMEDATALEN. O comprimento é definido em tempo de compilação (sendo, portanto, ajustável para usos especiais); o padrão para comprimento máximo poderá mudar em uma versão futura. O tipo "char" (observe as aspas) é diferente de char(1), porque utiliza apenas um byte para armazenamento. É utilizado internamente nos catálogos do sistema como o tipo de enumeração do homem pobre (poor-man's enumeration type).

Tabela 5-5. Tipos especiais para caracteres

Nome do tipoArmazenamentoDescrição
"char"1 bytetipo interno de um único caractere
name64 bytestipo interno de sessenta e três caracteres