Amazon Redshift 中的无符号字段?

Unsigned field in Amazon Redshift?

我一直在寻找一种方法来创建 table 无符号整数(我知道我将只有正整数,所以为什么不将范围扩大两倍)。要创建一个整数字段,我这样做:

create table funny_table(
    my_field bigint
);

所以我认为使用 my_field bigint unsigned 会解决我的问题,但语法错误告诉我并非如此。看起来 documentation 并没有说明无符号整数。有可能吗?

很遗憾,Amazon Redshift 不支持无符号整数。作为解决方法,我们对 bigint unsigned 数据使用 numeric(20,0)。这是一个例子。

create table funny_table(
    my_field numeric(20, 0)
);
insert into funny_table values ( 18446744073709551614 );
select * from funny_table;
       my_field
----------------------
 18446744073709551614
(1 row)

有关数值类型的详细信息,请参阅here

如前所述,Redshift 不支持 unsigned。鉴于此,请进一步了解您需要实现的目标。

bigint 占用 8 个字节,范围为 -9223372036854775808 到 9223372036854775807

numeric 占用 128 位(可变,最多 128 位)但以牺牲内存为代价提供更大的范围。

我相信使用 unsigned 的想法是在不增加存储费用的情况下将范围扩大一倍。因此,如果您对 2^63 - 1 的最高正值感到满意,请使用 bigint 并忘记 unsigned,因为它无论如何都要花费 8 个字节。

如果您有更大的正整数,请使用 numeric(20, 0)(或更高的精度),但您需要注意它仍然是有符号的并且占用超过 8 个字节。

对于 运行 无法从源 table 复制 unsigned int 值的问题的任何人:

您必须更改之前的元组映射:

("id", "int", "id", "int")

("id", "id", "decimal(20,0)")

我们的 redshift 集群中始终有 null 个 id 值。映射中的更改改变了此行为,从而导致正确地从源 table.

复制值