10.4. Armazenamento de valor #

Os valores a serem inseridos em uma tabela são convertidos para o tipo de dados da coluna de destino segundo as etapas que se seguem.

Conversão de tipo de dados para armazenamento de valor

  1. Verifique se há uma correspondência exata com o destino.

  2. Se não houver, tente converter a expressão para o tipo de dados do destino. Isto será possível se uma conversão de atribuição entre os dois tipos de dados estiver registrada no catálogo pg_cast (veja CREATE CAST). Como alternativa, se a expressão for um literal com tipo de dados desconhecido, o conteúdo do literal cadeia de caracteres será alimentado na rotina de conversão de entrada para o tipo de dados do destino.

  3. Verifique se há uma conversão de tamanho para o tipo de dados do destino. Uma conversão de tamanho é uma conversão de um tipo de dados para ele mesmo. Se alguma conversão for encontrada no catálogo pg_cast, aplique-a à expressão antes de armazená-la na coluna de destino. A função de implementação para este tipo de conversão sempre recebe um parâmetro adicional do tipo de dados integer, que recebe o valor atttypmod da coluna de destino (normalmente seu comprimento declarado, embora a interpretação de atttypmod varie para diferentes tipos de dados), e pode aceitar um terceiro parâmetro do tipo de dados boolean, que informa se a conversão é explícita ou implícita. A função de conversão é responsável por aplicar qualquer semântica dependente de comprimento, como a verificação de tamanho ou truncamento.

Exemplo 10.9. Conversão de tipo de dados para armazenamento de character

Para uma coluna de destino declarada como character(20), a instrução a seguir mostra que o valor armazenado está dimensionado corretamente:

CREATE TABLE vv (v character(20));
INSERT INTO vv SELECT 'abc' || 'def';
SELECT v, octet_length(v) FROM vv;

          v           | octet_length
----------------------+--------------
 abcdef               |           20
(1 linha)

Na verdade, o que acontece aqui é que os dois literais com tipos de dados desconhecidos são resolvidos para text por padrão, permitindo que o operador || seja resolvido como concatenação de text. Em seguida, o resultado text do operador é convertido para o tipo bpchar (caractere preenchido com branco, o nome interno do tipo de dados character), para corresponder ao tipo de dados da coluna de destino. (Como a conversão de text para bpchar é coercível binariamente, esta conversão não insere nenhuma chamada real de função.) No final, a função de dimensionamento bpchar(bpchar, integer, boolean) é encontrada no catálogo do sistema, e aplicada ao resultado do operador e ao comprimento da coluna armazenada. Esta função, específica deste tipo de dados, executa a verificação de comprimento necessária e a adição de espaços de preenchimento.


Exemplo 10.10. Exemplo do tradutor

Armazenamento do tipo de dados character na codificação UTF-8.

Este exemplo complementa o exemplo anterior, armazenando letras acentuadas em uma coluna do tipo de dados character(20), em um ambiente onde tanto o cliente quanto o servidor estão utilizando a codificação UTF-8. Como pode ser visto, as 20 letras acentuadas armazenadas na coluna ocupam 40 octetos (bytes) para o seu armazenamento, ou seja, 2 octetos por caractere.

SHOW client_encoding;
 client_encoding
-----------------
 UTF8
(1 linha)
SHOW server_encoding;
 server_encoding
-----------------
 UTF8
(1 linha)
CREATE TEMPORARY TABLE vv (v character(20));
INSERT INTO vv SELECT 'abc' || 'def';
INSERT INTO vv SELECT 'áéíóúÁÉÍÓÚ' || 'áéíóúÁÉÍÓÚ';
SELECT v, char_length(v), octet_length(v) FROM vv;
          v           | char_length | octet_length
----------------------+-------------+--------------
 abcdef               |           6 |           20
 áéíóúÁÉÍÓÚáéíóúÁÉÍÓÚ |          20 |           40
(2 linhas)