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 text
basamak 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 integer
hem sorunları çözmek için doğrudan.