PostgreSQL'de bir bayt tam sayı nasıl saklanır?


14

PostgreSQL belgelerinde, tamsayı veri türlerinin iki, dört veya sekiz baytlık alanda depolanabileceği söylenir . Veritabanımdaki bir tablonun sütunlarından biri bir bayt tam sayı değeri içeriyor ve ben bir bayt veri türünde saklanmasını istiyorum.

  1. PostgreSQL'de tek baytlık tamsayı veri türünü kullanmanın bir uzantısı veya yolu var mı?
  2. NUMERIC (1,0) kaç bayt?

Yanıtlar:


16

Hayır , Postgres'in standart dağıtımında 1 bayt tam sayı yoktur. Tüm yerleşik sayısal standart Postgres türleri 2 veya daha fazla bayt kaplar.

Uzatma pguint

Ancak evet , Postgres çekirdek geliştiricilerinden Peter Eisentraut tarafından sürdürülen uzatma pguint'i var . Standart dağıtımın bir parçası değildir:

İşaretsiz çeşitli tamsayı türlerine ek olarak, aradığınız 1 baytlık tamsayıyı da sağlar:

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)

Bağlantılı bölgedeki "Tartışma" bölümünü okuduğunuzdan ve olası komplikasyonları açıkladığınızdan emin olun. Daha fazla tamsayı türü tanıtırken, tür kalıpları ve sayısal değişmez değerlerle dikkat etmeniz gerekir ...

Geçici çözüm

Olası, basit bir çözüm, 1 baytlık tamsayı değerlerini "char", aslında tek bir depolama baytını, işaretli 1 baytlık bir tamsayının bayt değerlerini kullanan "iç" basit 1 karakterli bir tür olarak kodlamak olacaktır ; üst yarısı, ASCII karakterleri.

-128 ila 127 aralığındaki değerleri kodlayabilirsiniz . Demo:

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

Görüntülenmesi amaçlanmayan birkaç karakter var. Bu yüzden görüntülemeden önce depolayıp kodunu çözmeden önce kodlayın ...

Unutmayın: "char"basit ve ucuz numaralandırma için tasarlanmış bir "iç" tiptir. Burada yaptığımız şey için resmi olarak tasarlanmamıştır ve diğer RDBMS için taşınabilir değildir. Postgres projesi tarafından bunun için hiçbir garanti yoktur.

İlk önerilerim dikkatsizce, 1 baytlık işaretsiz bir tam sayı aralığını (0-255) kapsayacağımız ve textbasamak taşı olarak kullanabileceğimiz varsayımına dayanıyordu . Evan yolumun hatalarına dikkat çekti: bu sadece 1 - 127 sayıları için işe yarıyor ve geri kalanı için başarısız oluyor. Bunun yerine, döküm arasında 127 tam sayı aralığı -128 kullanıp "char"ve integerhem sorunları çözmek için doğrudan.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.