数值数据类型¶
本主题介绍 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 |
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
浮点数的数据类型¶
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 |
注释 |
---|---|---|---|
|
|
|
在 Snowflake 中, |
|
|
|
Snowflake 将 |
舍入误差¶
浮点运算在最低有效位数中可能会有微小的舍入误差。舍入误差可能发生在任何类型的浮点处理中,包括三角函数、统计函数和地理空间函数。
每次执行查询时,误差都可能有所不同。
当操作数具有不同的精度或小数位数时,误差可能会更大。
误差可能会累积,尤其是当聚合函数(例如 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 |
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
备注
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