Tabela 8.4. Tipos de dados de cadeia de caracteres
| Nome | Descrição |
|---|---|
character varying(, varchar( | comprimento variável com limite |
character(, char(, bpchar( | comprimento fixo, completado com espaços |
bpchar | comprimento variável sem limite, completado com espaços |
text | comprimento variável sem limite |
A Tabela 8.4 mostra os tipos de dados de caracteres de propósito geral disponíveis no PostgreSQL.
O padrão SQL define dois tipos de dados de
caracteres primários:
character varying( e
n)character(,
onde n)n é um número inteiro positivo.
Ambos os tipos podem armazenar cadeias de caracteres de até
n caracteres (não bytes) de comprimento.
Uma tentativa de armazenar uma cadeia de caracteres mais longa em
uma coluna destes tipos de dados resultará em um erro, a menos que
os caracteres excedentes sejam todos espaços, caso em que a
cadeia de caracteres será truncada para o comprimento máximo.
(Esta exceção um tanto bizarra é exigida pelo padrão
SQL.)
Entretanto, se for convertido explicitamente o valor para
character varying( ou
n)character(,
então um valor com comprimento excessivo será truncado para
n)n caracteres sem gerar um erro.
(Isto também é exigido pelo padrão SQL.)
Se a cadeia de caracteres a ser armazenada for menor que o
comprimento declarado, os valores do tipo de dados
character serão preenchidos com espaços;
os valores do tipo de dados character varying
simplesmente armazenarão a cadeia de caracteres mais curta.
Além destes, o PostgreSQL fornece o tipo
de dados text, que armazena cadeia de caracteres de
qualquer comprimento.
Embora o tipo de dados text não esteja presente no
padrão SQL, diversos outros sistemas de
gerenciamento de banco de dados SQL
também o possuem.
text é o tipo de dados de cadeia de caracteres nativo
do PostgreSQL, visto que a maioria das
funções internas que operam em cadeias de caracteres são declaradas
para receber ou retornar um valor do tipo de dados text,
e não character varying.
Para muitas finalidades, character varying age como se
fosse um domínio sobre text.
O nome do tipo de dados varchar é um alias para
character varying, enquanto bpchar
(com o comprimento especificado) e char
são aliases para character.
Os aliases varchar e char são definidos
no padrão SQL; bpchar
é uma extensão do PostgreSQL.
Se for especificado, o comprimento n
deve ser maior que zero e não pode exceder 10.485.760.
Se character varying (ou varchar)
for usado sem especificador de comprimento, este tipo de dados
irá aceitar cadeias de caracteres de qualquer comprimento.
Se bpchar não possuir um especificador de comprimento
também aceitará cadeias de caracteres de qualquer comprimento, mas
os espaços em branco no final serão semanticamente insignificantes.
Se character (ou char) não possuir um
especificador de comprimento, será equivalente a
character(1).
Os valores do tipo de dados character são fisicamente
preenchidos com espaços até o comprimento especificado
n, sendo armazenados e mostrados dessa forma.
Entretanto, os espaços à direita são tratados como semanticamente
insignificantes e desconsiderados ao comparar dois valores do
tipo de dados character.
Em ordenações (locale) onde o
espaço em branco é significativo, este comportamento pode produzir
resultados inesperados; por exemplo,
SELECT 'a '::CHAR(2) collate "C" < E'a\n'::CHAR(2)
retorna verdade, embora a ordenação C
considere o caractere espaço maior do que o caractere de nova-linha.
Os espaços à direita são removidos ao converter um valor de
character para um dos outros tipos de dados de
cadeia de caracteres.
Note que os espaços à direita são semanticamente
significativos em valores character varying e
text, e ao usar correspondência de padrões, ou seja,
LIKE e expressões regulares.
Os caracteres que podem ser armazenados em qualquer um destes tipos
de dados são determinados pelo conjunto de caracteres do banco de
dados, selecionado quando o banco de dados é criado.
Independentemente do conjunto de caracteres específico, o caractere
com código zero (às vezes chamado de NULL) não
pode ser armazenado. Para obter mais informações, veja a
Seção 23.3.
O requisito de armazenamento para uma cadeia de caracteres curta
(até 126 bytes) é de 1 byte mais a cadeia de caracteres real, que
inclui o preenchimento de espaço no caso de character.
Cadeias de caracteres mais longas têm 4 bytes a mais, em vez de 1.
Cadeias de caracteres longas são comprimidas pelo sistema
automaticamente, portanto o requisito físico no disco pode ser menor.
Os valores muito longos também são armazenados em tabelas em segundo
plano, para não interferirem no acesso rápido a valores de coluna
mais curtos.
Em qualquer caso, a cadeia de caracteres mais longa possível que pode
ser armazenada é de cerca de 1 GB. (O valor máximo que será permitido
para n na declaração do tipo de dados é
menor que isto.
Não seria útil mudar isto, porque com codificações de caracteres
multibyte o número de caracteres e bytes podem ser bem diferentes.
Se for desejado armazenar cadeia de caracteres longas sem limite
superior específico, deve ser usado o tipo de dados text ou
character varying sem um especificador de comprimento,
em vez de especificar um limite de comprimento arbitrário.)
Não há diferença de desempenho entre estes três tipos de dados,
além do aumento do espaço de armazenamento ao usar o tipo de dados
com preenchimento de brancos e alguns ciclos extras de CPU para
verificar o comprimento ao armazenar em uma coluna com restrição
de comprimento.
Embora character( possa
ter vantagem de desempenho em alguns outros sistemas de banco de
dados, esta vantagem não existe no
PostgreSQL;
na verdade, n)character(
é geralmente o mais lento dos três devido aos custos adicionais de
armazenamento. Na maioria das situações deve ser usado
n)text ou character varying em vez de
character(.
n)
Veja Seção 4.1.2.1 para obter informações sobre a sintaxe de literais cadeia de caracteres, e o Capítulo 9 para obter informações sobre os operadores e funções disponíveis.
Exemplo 8.4. Usando os tipos de dados de caractere
CREATE TABLE test1 (a character(4));
INSERT INTO test1 VALUES ('ok');
SELECT a, char_length(a) FROM test1; -- (1)
a | char_length ------+------------- ok | 2
CREATE TABLE test2 (b varchar(5));
INSERT INTO test2 VALUES ('ok');
INSERT INTO test2 VALUES ('bom ');
INSERT INTO test2 VALUES ('muito longo');
ERRO: valor muito longo para tipo character varying(5)
INSERT INTO test2 VALUES ('muito longo'::varchar(5)); -- truncamento explícito
SELECT b, char_length(b) FROM test2;
b | char_length -------+------------- ok | 2 bom | 5 muito | 5 (3 linhas)
Existem outros dois tipos de dados de caracteres de comprimento
fixo no PostgreSQL, mostrados na
Tabela 8.5.
Estes tipos de dados não se destinam ao uso geral, mas apenas
ao uso noa catálogos internos do sistema.
O tipo de dados name é usado para armazenar
identificadores.
Seu comprimento está atualmente definido como 64 bytes
(63 caracteres utilizáveis mais o terminador)
mas deve ser referenciado usando a constante
NAMEDATALEN no 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 poderá ser alterado em uma versão futura.
O tipo de dados "char" (observe as aspas) é diferente
de char(1), porque usa apenas um byte de armazenamento
e, portanto, só pode armazenar um único caractere
ASCII.
É utilizado internamente nos catálogos do sistema como um tipo de
dados de enumeração simplista.
Tabela 8.5. Tipos de dados de caractere especiais
| Nome | Tamanho de armazenamento | Descrição |
|---|---|---|
"char" | 1 byte | tipo de dados interno de um byte |
name | 64 bytes | tipo de dados interno para nomes de objetos |