数值数据类型¶
本主题介绍 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、BYTEINT 等)是为了简化从其他系统移植的过程,以及建议指定类型的列的预期值范围。
精度和小数位数对存储大小的影响¶
精度(总位数)不影响存储。对于精度不同的列(例如 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(
num0 NUMBER,
num10 NUMBER(10,1),
dec20 DECIMAL(20,2),
numeric30 NUMERIC(30,3),
int1 INT,
int2 INTEGER);
DESC TABLE test_fixed;
+-----------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|-----------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| NUM0 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| NUM10 | NUMBER(10,1) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| DEC20 | NUMBER(20,2) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| NUMERIC30 | NUMBER(30,3) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| INT1 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| INT2 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | 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。(Snowflake 可以表示介于约 10-324 到 10-308 之间的更极端的值,采用较低的精度。)有关更多详细信息,请参阅 关于双精度数的维基百科文章 (link removed)。
Snowflake 支持定点数据类型 NUMBER,尽管指数范围较小,但允许更高的精度。
特殊值¶
Snowflake 支持以下 FLOAT 类型的特殊值:
符号 'NaN'
、'inf'
和 '-inf'
必须放在单引号内,并且不区分大小写。
'NaN'
的比较语义与 IEEE 754 标准在以下方面有所不同:
条件 |
Snowflake |
IEEE 754 |
注释 |
---|---|---|---|
|
|
|
在 Snowflake 中, |
|
|
|
在 Snowflake 中, |
舍入误差¶
浮点运算在最低有效位数中可能会有微小的舍入误差。舍入误差可能发生在任何类型的浮点处理中,包括三角函数、统计函数和地理空间函数。
以下是舍入误差的注意事项:
DOUBLE、DOUBLE PRECISION、REAL¶
与 FLOAT 同义。
表中的浮点数据类型示例¶
下面的语句创建了一个表,包含各种浮点数据类型的列:
CREATE OR REPLACE TABLE test_float(
double1 DOUBLE,
float1 FLOAT,
dp1 DOUBLE PRECISION,
real1 REAL);
DESC TABLE test_float;
+---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| DOUBLE1 | FLOAT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| FLOAT1 | FLOAT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| DP1 | FLOAT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| REAL1 | FLOAT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
+---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
备注
DESC TABLE 命令的 type
列显示的数据类型 FLOAT 不仅针对 FLOAT,还针对 FLOAT 的同义词(例如 DOUBLE、DOUBLE PRECISION 和 REAL)。
数值常量¶
术语 常量`(也称为 :emph:`字面量)是指固定的数据值。数值常量支持以下格式:
[+-][digits][.digits][e[+-]digits]
其中:
+
或-
表示正值或负值。默认为正值。digits
是 0 到 9 范围内的一个或多个数字。e
(或E
)表示科学记数法中的指数。指数标记后必须至少有一位数字(如果存在)。
以下数字都是受支持的数值常量的示例:
15
+1.34
0.2
15e-03
1.234E2
1.234E+2
-1