数值数据类型

本主题介绍 Snowflake 中支持的数值数据类型,以及支持的数值常量/字面量格式。

本主题内容:

定点数的数据类型

Snowflake 支持以下定点数数据类型。

NUMBER

数字最多可达 38 位,精度和小数位数可选:

精度:

允许的总位数。

小数位数:

小数点右侧允许的位数。

默认情况下,精度为 38,小数位数为 0``(即 ``NUMBER(38, 0))。请注意,精度限制了可插入(或强制转换为)给定类型列的值的范围。例如,值 999 适合放入 NUMBER(38,0),但不适合放入 NUMBER(2,0)

最大小数位数(小数点右侧的位数)为 37。如果数字的有效位数少于 38 位,但其最低有效位数位于小数点后第 37 位之后(例如 0.0000000000000000000000000000000000000012 [1.2e-39]),则在不损失一些精度数位的情况下,无法表示。

备注

如果将数据转换为精度较低的其他数据类型,然后再转换回精度较高的形式,则数据可能会出现精度损失。例如,如果将 NUMBER(38,37) 值转换为 DOUBLE (其精度约为 15 位小数数字),然后再转换回 NUMBER,则会损失精度。

Snowflake 还支持 FLOAT 数据类型,该类型允许的值范围更广,但精度较低。

DECIMAL、DEC、NUMERIC

与 NUMBER 同义。

INT、INTEGER、BIGINT、SMALLINT、TINYINT、BYTEINT

与 NUMBER 同义,但不能指定精度和小数位数(即始终默认为 NUMBER(38, 0))。因此,对于所有 INTEGER 数据类型,值范围都是从 -99999999999999999999999999999999999999 到 +99999999999999999999999999999999999999(含)的所有整数值。

各种不同的名称(TINYINT 等)是为了简化从其他系统移植的过程,以及建议指定类型的列的预期值范围。

精度和小数位数对存储大小的影响

精度(总位数)不影响存储。换言之,对于精度不同的列(例如 NUMBER(2,0)NUMBER(38,0))中相同的数字,其存储要求是相同的。对于每个微分区,Snowflake 会确定给定列的最小值和最大值,并会使用该信息确定分区中该列的所有值的存储大小。例如:

  • 如果列仅包含 -128+127 之间的值,则每个值将占用 1 个字节(未压缩)。

  • 如果列中的最大值为 10000000,则其中每个值将占用 4 个字节(未压缩)。

但是,小数位数(小数点后面的位数)确实会对存储产生影响。例如,相同的值存储在类型为 NUMBER(10,5) 的列中比存储在类型为 NUMBER(5,0) 的列中要占用更多的空间。此外,处理小数位数较大的值时速度可能会略慢,并且会消耗更多内存。

为了节省空间,Snowflake 会在将值写入存储之前对其进行压缩。压缩量取决于数据值和其他因素。

表中的定点数据类型示例

CREATE OR REPLACE TABLE test_fixed(num NUMBER,
                                    num10 NUMBER(10,1),
                                    dec DECIMAL(20,2),
                                    numeric NUMERIC(30,3),
                                    int INT,
                                    integer INTEGER
                                    );

DESC TABLE test_fixed;

+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name    | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| NUM     | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| NUM10   | NUMBER(10,1) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| DEC     | NUMBER(20,2) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| NUMERIC | NUMBER(30,3) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| INT     | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| INTEGER | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

浮点数的数据类型

Snowflake 支持以下浮点数数据类型。

FLOAT、FLOAT4、FLOAT8

名称 FLOAT、FLOAT4 和 FLOAT8 是为了与其他系统兼容;Snowflake 将这三类数值都视为 64 位浮点数。

精度

Snowflake 使用双精度(64 位)IEEE 754 浮点数。

精度约为 15 位。例如,对于整数,取值范围为 -9007199254740991 到 +9007199254740991(-253 + 1 到 +253 - 1)。浮点值的范围约为 10-308 到 10+308。(介于约 10-324 到 10-308 之间的更极端的值,可以用较低的精度表示。有关更多详细信息,请参阅 关于双精度数的维基百科文章 (link removed)。

Snowflake 支持定点数据类型 NUMBER,尽管指数范围较小,但允许更高的精度。

特殊值

Snowflake 支持以下 FLOAT 类型的特殊值:

  • 'NaN' (不是数字)。

  • 'inf' (无穷大)。

  • '-inf' (负无穷大)。

符号 'NaN''inf''-inf' 必须放在单引号内,并且不区分大小写。

'NaN' 的比较语义与 IEEE 754 标准在以下方面有所不同:

条件

Snowflake

IEEE 754

注释

'NaN' = 'NaN'

TRUE

FALSE

在 Snowflake 中,'NaN' 值都是相等的。

'NaN' > X . 其中 X 是任意 FLOAT 值,包括 . 无穷大(NaN 本身除外)。

TRUE

FALSE

Snowflake 将 'NaN' 视为 . 大于任何其他 FLOAT 值,. 包括无穷大。

舍入误差

浮点运算在最低有效位数中可能会有微小的舍入误差。舍入误差可能发生在任何类型的浮点处理中,包括三角函数、统计函数和地理空间函数。

每次执行查询时,误差都可能有所不同。

当操作数具有不同的精度或小数位数时,误差可能会更大。

误差可能会累积,尤其是当聚合函数(例如 SUM() 或 AVG())处理大量行时。在聚合之前类型转换为定点数据类型可以减少或消除这些误差。

舍入误差不仅会在使用 SQL 时发生,在处理 Snowflake 中运行(例如在 UDFs存储过程 中)的其他代码(例如 Java、JavaScript 或 Python)时也会发生。

在比较两个浮点数时,Snowflake 建议比较近似相等性而不是完全相等性。

DOUBLE、DOUBLE PRECISION、REAL

与 FLOAT 同义。

表中的浮点数据类型示例

CREATE OR REPLACE TABLE test_float(d DOUBLE,
                                   f FLOAT,
                                   dp DOUBLE PRECISION,
                                   r REAL
                                   );

DESC TABLE test_float;

+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name    | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| D       | FLOAT        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| F       | FLOAT        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| DP      | FLOAT        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| R       | FLOAT        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

备注

DESCRIBE TABLE 命令的“type”列显示的数据类型“FLOAT”不仅针对 FLOAT,还针对 FLOAT 的同义词(例如 DOUBLE、DOUBLE PRECISION 和 REAL)。

数值常量

常量 (也称为 字面量)是指固定的数据值。数值常量支持以下格式:

[+-][digits][.digits][e[+-]digits]

其中:

  • +- 表示正值或负值。默认为正值。

  • digits 是 0 到 9 范围内的一个或多个数字。

  • e (或 E)表示科学记数法中的指数。指数标记后必须至少有一位数字(如果存在)。

以下数字都是受支持的数值常量的示例:

15
+1.34
0.2
15e-03
1.234E2
1.234E+2
-1
Copy
语言: 中文