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.
复制值
我一直在寻找一种方法来创建 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.