Як зберігати однобайтове ціле число в PostgreSQL?


14

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

  1. Чи є розширення або спосіб використовувати однобайтовий цілочисельний тип даних у PostgreSQL?
  2. Скільки байт - NUMERIC (1,0)?

Відповіді:


16

Ні , в стандартному розподілі 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безпосередньо, щоб виправити обидві проблеми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.