Na documentação do PostgreSQL, diz-se que os tipos de dados inteiros podem ser armazenados em espaços de dois, quatro ou oito bytes. Uma das colunas de uma tabela em meu banco de dados contém um valor inteiro de um byte e desejo que seja armazenado em um tipo de dados de um byte.
- Existe uma extensão ou uma maneira de usar o tipo de dados inteiro de um byte no PostgreSQL?
- Quantos bytes tem NUMERIC(1,0)?
Não , não há inteiro de 1 byte na distribuição padrão do Postgres. Todos os tipos numéricos integrados do Postgres padrão ocupam 2 ou mais bytes.
Extensão pguint
Mas sim , existe a extensão pguint , mantida por Peter Eisentraut, um dos principais desenvolvedores do Postgres. Não faz parte da distribuição padrão:
Além de vários tipos inteiros sem sinal, ele também fornece o inteiro de 1 byte que você está procurando:
Certifique-se de ler o capítulo "Discussão" no site vinculado, explicando possíveis complicações. Você precisa ter cuidado com conversão de tipos e literais numéricos ao introduzir mais tipos inteiros...
Solução Parcial
Uma possível solução simples seria codificar valores inteiros de 1 byte como
"char"
(com aspas duplas!), um tipo simplista "interno" de 1 caractere, que na verdade usa um único byte de armazenamento . Até o Postgres 9.5, cobria valores de byte de um inteiro de 1 byte com sinal (intervalo decimal de -128 a 127). Mas desde então foi reduzido para cobrir apenas números positivos, que são representados como caracteres ASCII. Portanto, apenas metade do intervalo de um inteiro de byte único.Você pode codificar valores no intervalo de 0 a 127 :
db<>mexa aqui
Existem vários caracteres que não devem ser exibidos. Portanto, codifique antes de armazenar e decodifique antes de exibir.
Lembre-se:
"char"
é um tipo "interno" destinado a enumeração simples e barata. Não foi projetado oficialmente para o que estamos fazendo aqui e não é portátil para outros RDBMS. Não há garantias pelo projeto Postgres. Mas como"char"
é usado em todos os catálogos do sistema, o tipo não será alterado.Você também pode converter de
text
, agora que os números negativos foram excluídos.Você pode tentar armazená-lo comobit(8)
. https://www.postgresql.org/docs/12/datatype-bit.htmlConforme mencionado no comentário abaixo, o uso de bits requer 6 bytes acually.