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
Verifique se há uma correspondência exata com o destino.
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.
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)