如何在PostgreSQL中存储一字节整数?


14

在PostgreSQL文档中,据说整数数据类型可以存储在2字节,4字节或8字节的空间中。数据库中表的一列包含一个一字节的整数值,我希望将其存储为一字节的数据类型。

  1. 在PostgreSQL中是否有扩展或使用一字节整数数据类型的方法?
  2. NUMERIC(1,0)是多少个字节?

Answers:


16

,在Postgres的标准发行版中没有1字节的整数。标准Postgres的所有内置数字类型都占用2个或更多字节。

扩展名

,有扩展pguint,由彼得·Eisentraut的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"是一种“内部”类型,旨在进行简单且廉价的枚举。没有为我们在此所做的工作而正式设计,并且不能移植到其他RDBMS。Postgres项目对此没有任何保证。

我最初的建议是粗心大意的,基于这样的假设:我们将覆盖一个无符号的1字节整数(0-255)的范围,并且可以text用作垫脚石。埃文(Evan)指出了我的错误方式:该错误仅适用于1-127号,其余错误。相反,请使用-128到127之间的整数范围,并在"char"和之间强制转换以integer直接解决这两个问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.