8.3. Tipos de caracteres

Tabela 8-4. Tipos de Caracteres

Nome Descrição
variação de caracteres(n), varchar(n) comprimento variável com limite
caracter(n), char(n) comprimento fixo, blank padded
texto comprimento variável ilimitado

Table8-4 mostra os tipos de caracteres de uso geral disponíveis noPostgreSQL.

SQL define dois tipos de caracteres primários: caractere variando(n) e caractere(n), onde é um inteiro positivo. Ambos os tipos podem armazenar cadeias de caracteres até n caracteres (não bytes) em comprimento. Uma tentativa de armazenar uma string mais longa em uma coluna destes tipos irá resultar em um erro, a menos que os caracteres em excesso sejam todos espaços, caso em que a string será truncada até o comprimento máximo.(Esta exceção um pouco bizarra é requerida pelo padrão SQL.) Se a string a ser armazenada for maior que o comprimento declarado, os valores do tipo caractere serão acrescidos de espaço; valores de caracteres de digitação variável simplesmente armazenarão a stringhorter.

Se alguém lançar explicitamente um valor para caracterevarying(n) ou caractere(n), então um valor de comprimento superior será truncado para n caracteres sem levantar um erro. (Isto é requerido pelo padrão SQL.)

As notações varchar(n) e char(n) são apelidos para variador de caracteres(n)e caracter(n), respectivamente. caracter sem especificador de comprimento é equivalente a tocharacter(1). Se o especificador charactervarying for usado sem especificador de comprimento, o tipo aceita strings de qualquer tamanho. O último é uma extensão PostgreSQL.

Além disso, PostgreSQL fornece o tipo de texto, que armazena strings de qualquer comprimento. Embora o tipo de texto não esteja no padrão SQL, vários outros sistemas de gerenciamento de banco de dados SQL também o têm.

Valores do tipo de caractere são fisicamente estocados com espaços para a largura especificada n, e são armazenados e exibidos dessa forma.No entanto, os espaços de preenchimento são tratados como semanticamente insignificantes. Os espaços de preenchimento são desconsiderados quando se comparam dois valores de caracteres do tipo twovalues, e eles serão removidos ao converter um valor de caractere para um dos outros tipos de string. Note que espaços residuais são semanticamente significantes na variação de caracteres e valores de texto, e quando usando correspondência de padrão, por exemplo, LIKE, expressões regulares.

O requisito de armazenamento para uma string curta (até 126 bytes) é1 byte mais a string real, que inclui o preenchimento do espaço no caso do caractere. Cadeias mais longas têm 4 bytes de overhead em vez de 1. Cadeias longas são comprimidas automaticamente pelo sistema, de modo que o requisito físico em disco pode não funcionar. Valores muito longos também são armazenados em tabelas de fundo para que eles não interfiram no acesso rápido a valores de colunas mais curtas. Em qualquer caso, a cadeia de caracteres mais longa possível que pode ser melhorada é cerca de 1 GB. (O valor máximo que será permitido forn na declaração do tipo de dados não é maior do que isso. Não seria útil mudar isso porque withmultibyte encodings de caracteres o número de caracteres e bytes podem ser bem diferentes. Se você deseja armazenar strings longas com limite superior específico, use texto ou caracteres variando sem um especificador de comprimento, ao invés de criar um limite de comprimento arbitrário.)

Tip: Não há diferença de desempenho entre esses três tipos de caracteres, além do aumento do espaço de armazenamento quando se usa o tipo de bloco e alguns ciclos extras de CPU para verificar o comprimento quando se armazena em uma coluna com restrições de comprimento. Enquanto o character(n) tem vantagens de desempenho em alguns outros sistemas de banco de dados, há uma grande vantagem no PostgreSQL; o infact character(n) é geralmente o mais lento das três causas dos seus custos adicionais de armazenamento. Na maioria das situações o texto ou caractervarying deve ser usado em vez disso.

Refer à Seção 4.1.2.1 para informações sobre a sintaxe dos literais de string, e aoCapítulo 9 para informações sobre operadores e funções disponíveis. O conjunto de caracteres da base de dados determina o conjunto de caracteres usado para armazenar valores textuais; para mais informações sobre suporte a conjunto de caracteres, consulte a Seção 22.3.

Exemplo 8-1. Usando os tipos de caracteres

CREATE TABLE test1 (a character(4));INSERT INTO test1 VALUES ('ok');SELECT a, char_length(a) FROM test1; -- (1) a | char_length------+------------- ok | 2CREATE TABLE test2 (b varchar(5));INSERT INTO test2 VALUES ('ok');INSERT INTO test2 VALUES ('good ');INSERT INTO test2 VALUES ('too long');ERROR: value too long for type character varying(5)INSERT INTO test2 VALUES ('too long'::varchar(5)); -- explicit truncationSELECT b, char_length(b) FROM test2; b | char_length-------+------------- ok | 2 good | 5 too l | 5
(1) A função char_length é discutida na Seção 9.4.

Existem dois outros tipos de caracteres de comprimento fixo no PostgreSQL, mostrados na Tabela8-5. O tipo de nome existe apenas para o armazenamento de identificadores nos catálogos internos do sistema e não se destina a ser utilizado pelo usuário geral. Seu comprimento é atualmente definido como 64 bytes (63 caracteres utilizáveis mais terminador), mas deve ser referenciado usando a constante NAMEDATALEN em código fonte C. O comprimento é definido em tempo de compilação (e é portanto ajustável para usos especiais); o comprimento máximo padrão pode mudar em uma versão futura. O tipo “char” (note as aspas) é diferente de char(1) na medida em que ele usa apenas um byte de armazenamento. Ele é utilizado internamente nos catálogos do sistema como um tipo de enumeração simplista.

Tabela 8-5. Tipos de caracteres especiais

Nome Tamanho do armazenamento Descrição
“char” 1 byte única…byte tipo interno
nome 64 bytes tipo interno para nomes de objetos

Deixe uma resposta

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