Как хранить однобайтовое целое число в PostgreSQL?

14

В документации PostgreSQL говорится, что целочисленные типы данных могут храниться в двух-, четырех- или восьмибайтовом пространстве. Один из столбцов таблицы в моей базе данных содержит однобайтовое целочисленное значение, и я хочу, чтобы оно хранилось в однобайтовом типе данных.

  1. Есть ли расширение или способ использовать однобайтовый целочисленный тип данных в PostgreSQL?
  2. Сколько байтов ЧИСЛО (1,0)?
UKLL
источник

Ответы:

16

Нет , в стандартном выпуске Postgres нет 1-байтового целого числа. Все встроенные числовые типы стандартных Postgres занимают 2 и более байтов.

Расширение пингвин

Но да , есть расширение pguint , поддерживаемое Питером Эйзентраутом, одним из разработчиков ядра Postgres. Это не часть стандартного дистрибутива:

В дополнение к различным целочисленным типам без знака он также предоставляет искомое целое число из 1 байта:

int1 (signed 8-bit integer)
uint1 (unsigned 8-bit integer)
uint2 (unsigned 16-bit integer)
uint4 (unsigned 32-bit integer)
uint8 (unsigned 64-bit integer)

Обязательно прочитайте главу «Обсуждение» на связанном сайте, объясняя возможные осложнения. Вам нужно проявлять осторожность с приведением типов и числовыми литералами при представлении более целочисленных типов ...

Временное решение

Возможный простой обходной путь - это кодирование 1-байтовых целочисленных значений в "char"виде «внутреннего» упрощенного 1-символьного типа, который фактически использует один байт памяти , байтовые значения 1-байтового целого числа со знаком, верхняя половина которого представлена ​​в виде Символы ASCII.

Вы можете кодировать значения в диапазоне от -128 до 127 . Демо - версия:

SELECT i
     , i::"char"
     , i::"char"::int
FROM   generate_series(-128,127) i;

Есть несколько символов, не предназначенных для отображения. Так что кодируйте перед сохранением и декодируйте перед отображением ...

Помните: "char"это «внутренний» тип, предназначенный для простого и дешевого перечисления. Официально не предназначен для того, что мы здесь делаем, и не переносим на другие СУБД. Нет никаких гарантий от проекта Postgres для этого.

Мои первоначальные предложения были небрежно основаны на предположении, что мы охватим диапазон беззнакового 1-байтового целого числа (0-255), и мы могли бы использовать его в textкачестве ступеньки. Эван указал на ошибки моего пути: это работает только для чисел 1 - 127 и не работает для остальных. Вместо этого используйте целочисленный диапазон от -128 до 127 и приведите между "char"и integerнапрямую, чтобы исправить обе проблемы.

Эрвин Брандштеттер
источник