Ні , в стандартному розподілі Postgres немає 1-байтового цілого числа. Усі вбудовані числові типи стандартних Postgres займають 2 або більше байт.
Розширення pguint
Але так , є 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)
Обов’язково прочитайте розділ "Обговорення" на пов'язаному сайті, пояснивши можливі ускладнення. Під час введення більшої кількості цілих типів потрібно проявляти обережність із типом типів та числовими буквами ...
Обхід
Можливим простим рішенням було б кодування однобайтових цілих значень як "char"
"внутрішній" спрощений 1-символьний тип, який фактично використовує один байт сховища , байтові значення підписаного 1-байтового цілого числа, верхня половина представлена як ASCII символів.
Можна кодувати значення в діапазоні від -128 до 127 . Демонстрація:
SELECT i
, i::"char"
, i::"char"::int
FROM generate_series(-128,127) i;
Є кілька символів, не призначених для відображення. Тому кодуйте, перш ніж зберігати та декодувати, перш ніж відображати ...
Пам'ятайте: "char"
це "внутрішній" тип, призначений для простого і дешевого перерахування. Офіційно не розроблений для того, що ми робимо тут, і не переноситься на інші RDBMS. Немає гарантій проектом Postgres на це.
Мої початкові пропозиції недбало ґрунтувались на припущенні, що ми покриємо діапазон неподписаного 1-байтового цілого числа (0-255) і можемо використовувати його text
як кроковий камінь. Еван вказав на помилки мого шляху: це працює лише для чисел 1 - 127, а для інших - не вдається. Замість цього використовуйте цілий діапазон від -128 до 127 і киньте між ними "char"
та integer
безпосередньо, щоб виправити обидві проблеми.