Amazon Redshift中的未签名字段?

时间:2015-01-09 01:41:15

标签: amazon-redshift

我一直在寻找一种用无符号整数创建表的方法(我知道我只有正整数,所以为什么不增加两倍的范围)。要创建一个整数字段,我会这样做:

create table funny_table(
    my_field bigint
);

所以我认为使用my_field bigint unsigned将解决我的问题,但语法错误告诉我。虽然看documentation没有说明无符号整数。它甚至可能吗?

3 个答案:

答案 0 :(得分:2)

不幸的是,Amazon Redshift不支持无符号整数。作为解决方法,我们将numeric(20,0)用于bigint unsigned数据。这是一个例子。

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

答案 1 :(得分:1)

如上所述,Redshift不支持unsigned。鉴于此,请仔细了解您需要实现的目标。

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

numeric占用128位(可变,最多128位),但提供更大的范围,但会浪费内存。

我相信使用unsigned的想法是将范围扩大了一倍,而无需额外花费存储。因此,如果您对2^63 - 1的最大正值感到满意,请选择bigint并忽略无符号,因为它无论如何都要花费8个字节。

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

答案 2 :(得分:0)

对于遇到问题的任何人,他们都无法从源表复制未签名的int值:

您必须从以前更改元音映射:

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

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

在我们的redshift集群中,我们总是有null个值作为id。映射中的更改更改了此行为,从而导致正确复制了源表中的值。