【问题标题】:Unsigned field in Amazon Redshift?Amazon Redshift 中的未签名字段?
【发布时间】:2026-01-29 18:35:01
【问题描述】:

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

create table funny_table(
    my_field bigint
);

所以我认为使用my_field bigint unsigned 可以解决我的问题,但语法错误告诉我不然。尽管documentation 并没有说明无符号整数。有没有可能?

【问题讨论】:

    标签: amazon-redshift


    【解决方案1】:

    很遗憾,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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

        对于遇到无法从源表中复制 unsigned int 值的问题的任何人:

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

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

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

        我们的红移集群中始终有 null 值作为 id。映射的变化改变了这种行为,导致从源表中正确复制值。

        【讨论】: