数字类型 - Amazon Redshift

数字类型

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

整数类型

使用 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 列:

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。

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)。最大负值为 -9223372036854775808。例如,尝试插入值 9999999999999999999(19 个 9)将导致溢出错误。无论小数点的位置如何,Amazon Redshift 可表示为 DECIMAL 数的最大字符串为 9223372036854775807。例如,您可加载到 DECIMAL(19,18) 列中的最大值为 9.223372036854775807

这些规则是因为有效精度位为 19 位或更少的 DECIMAL 值在内部存储为 8 字节整数,而有效精度位为 20 到 38 位的 DECIMAL 值存储为 16 字节整数。

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

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

浮点类型

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

根据 IEEE 二进制浮点运算标准 754,REAL 表示单精度浮点数格式。它的精度约为 6 位,范围在 1E-37 到 1E+37 之间。您也可以将此数据类型指定为 FLOAT4。

根据 IEEE 二进制浮点运算标准 754,DOUBLE PRECISION 表示双精度浮点数格式。它的精度约为 15 位,范围在 1E-307 到 1E+308 之间。您也可以将此数据类型指定为 FLOAT 或 FLOAT8。

除普通数值外,浮点型还有几个特殊值。在 SQL 中使用这些值时,请在这些值周围使用单引号:

  • NaN – 非数字

  • Infinity – 无穷大

  • -Infinity – 负无穷大

例如,要在表 customer_activity 的列 day_charge 中插入非数字,请运行以下 SQL:

insert into customer_activity(day_charge) values('NaN');