Нет , в стандартном выпуске 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
напрямую, чтобы исправить обе проблемы.