Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

数字类型

数字数据类型包括整数、小数和浮点数。

整数类型

使用 SMALLINT、INTEGER 和 BIGINT 数据类型存储各种范围的整数。您无法存储每种类型所允许范围之外的值。

名称 存储 范围
SMALLINT 或 INT2 2 字节 -32768 到 +32767
INTEGER、INT 或 INT4 4 字节 -2147483648 到 +2147483647
BIGINT 或 INT8 8 字节 -9223372036854775808 到 9223372036854775807

DECIMAL 或 NUMERIC 类型

使用 DECIMAL 或 NUMERIC 数据类型存储具有用户定义的精度 的值。DECIMAL 和 NUMERIC 关键字是可互换的。在本文档中,小数 是此数据类型的首选术语。术语数字 一般用于指整数、小数和浮点数据类型。

存储 范围
可变,对于未压缩的 DECIMAL 类型可以多达 128 位。 128 位有符号整数,精度位数可以多达 38 位。

通过指定精度小数位数 来定义表中的 DECIMAL 列:

Copy
decimal(precision, scale)
精度

整个值中有效位的总数:小数点两边的位数。例如,数字 48.2891 的精度为 6,小数位数为 4。如果未指定,默认精度为 18。最大精度为 38。

如果输入值中的小数点左侧的位数超出了列的精度减去其小数位数的差值,则此值无法复制到列中(或无法插入或更新)。此规则适用于列定义范围之外的任何值。例如,numeric(5,2) 列所允许的值范围为 -999.99999.99

小数位数

值的小数部分中小数点右侧的小数位数。整数的小数位数为零。在列规范中,小数位数值必须小于或等于精度值。如果未指定,默认小数位数为 0。最大小数位数为 37。

如果加载到表中的输入值的小数位数大于列的小数位数,则该值将四舍五入到指定小数位数。例如,SALES 表中的 PRICEPAID 列为 DECIMAL(8,2) 列。如果将 DECIMAL(8,4) 值插入到 PRICEPAID 列中,则该值将四舍五入到小数位数 2。

Copy
insert into sales values (0, 8, 1, 1, 2000, 14, 5, 4323.8951, 11.00, null); select pricepaid, salesid from sales where salesid=0; pricepaid | salesid -----------+--------- 4323.90 | 0 (1 row)

但是,对于显示强制转换表中选定的值而得出的结果,不会进行四舍五入。

注意

您可插入到 DECIMAL(19,0) 列中的最大正值为 9223372036854775807 (263 -1)。最大负值为 -9223372036854775807。例如,尝试插入值 9999999999999999999(19 个 9)将导致溢出错误。无论小数点的位置如何,Amazon Redshift 可表示为 DECIMAL 数的最大字符串为 9223372036854775807。例如,您可加载到 DECIMAL(19,18) 列中的最大值为 9.223372036854775807。这些规则派生自作为 8 字节整数的 DECIMAL 值的内部存储。Amazon Redshift 建议您不要定义 19 位精度的 DECIMAL 值,除非此精度是必需的。

有关使用 128 位 DECIMAL 或 NUMERIC 列的说明

请勿为 DECIMAL 列随意分配最高精度,除非您确定您的应用程序需要此精度。128 位值使用的磁盘空间是 64 位值的两倍,可能会降低查询执行速度。

浮点类型

使用 REAL 和 DOUBLE PRECISION 数据类型可存储具有可变精度 的数值。这些类型是不精确的 类型,意味着一些值是作为估计值存储的,因此存储和返回某个特定值可能导致细微的差异。如果您需要精确的存储和计算(如货币金额),请使用 DECIMAL 数据类型。

名称 存储 范围
REAL 或 FLOAT4 4 字节 精度为 6 个有效位
DOUBLE PRECISION、FLOAT8 或 FLOAT 8 字节 精度为 15 个有效位

例如,请注意将下列值插入到 REAL 列中的结果:

Copy
create table real1(realcol real); insert into real1 values(12345.12345); insert into real1 values(123456.12345); select * from real1; realcol --------- 123456 12345.1 (2 rows)

这些插入值将截断以满足 REAL 列 6 个有效位的精度限制。