Tabela 5-4. Tipos para caracteres
Nome do tipo | Descrição |
---|---|
character varying(n), varchar(n) | comprimento variável com limite |
character(n), char(n) | comprimento fixo, completado com brancos |
text | comprimento 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
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).