SnowConvert AI - Redshift - Data types¶
Current Data types conversion for Redshift in SnowConvert AI.
Snowflake 支持最基本的 SQL 数据类型(存在部分限制),用于列、局部变量、表达式、参数和任何其他适当/合适的位置。
数值数据类型 ¶
Redshift |
Snowflake |
备注 |
|---|---|---|
INT |
INT |
Snowflake 的 INT 是 NUMBER 的别名。 |
INT2 |
SMALLINT |
Snowflake 的 INT2 是 NUMBER 的别名。 |
INT4 |
INTEGER |
Snowflake 的 INT4 是 NUMBER 的别名。 |
INT8 |
INTEGER |
Snowflake 的 INT8 是 NUMBER 的别名。 |
INTEGER |
INTEGER |
Snowflake 的 INTEGER 是 NUMBER 的别名。 |
BIGINT |
BIGINT |
Snowflake 的 BIGINT 是 NUMBER 的别名。 |
DECIMAL |
DECIMAL |
Snowflake 的 DECIMAL 是 NUMBER 的别名。 |
DOUBLE PRECISION |
DOUBLE PRECISION |
Snowflake 的 DOUBLE PRECISION 是 FLOAT 的别名。 |
NUMERIC |
NUMERIC |
Snowflake 的 NUMERIC 是 NUMBER 的别名。 |
SMALLINT |
SMALLINT |
Snowflake 的 SMALLINT 是 NUMBER 的别名。 |
FLOAT |
FLOAT |
Snowflake 使用双精度(64 位)IEEE 754 浮点数。 |
FLOAT4 |
FLOAT4 |
Snowflake 的 FLOAT4 是 FLOAT 的别名。 |
FLOAT8 |
FLOAT8 |
Snowflake 的 FLOAT8 是 FLOAT 的别名。 |
REAL |
REAL |
Snowflake 的 REAL 是 FLOAT 的别名。 |
字符类型 ¶
Redshift |
Snowflake |
备注 |
|---|---|---|
VARCHAR |
VARCHAR |
VARCHAR 存储 Unicode UTF-8 字符。如果未指定长度,则默认值为允许的最大长度 (16,777,216)。 |
CHAR |
CHAR |
Snowflake 的 CHAR 是 VARCHAR 的别名。 |
CHARACTER |
CHARACTER |
Snowflake 的 CHARACTER 是 VARCHAR 的别名。 |
NCHAR |
NCHAR |
Snowflake 的 NCHAR 是 VARCHAR 的别名。 |
BPCHAR |
VARCHAR |
Snowflake 不支持 BPCHAR 数据类型。改用 VARCHAR。如需了解更多信息,请参阅 SSC-FDM-PG0002。 |
NVARCHAR |
NVARCHAR |
Snowflake 的 NVARCHAR 是 VARCHAR 的别名。 |
CHARACTER VARYING |
CHARACTER VARYING |
Snowflake 的 CHARACTER VARYING 是 VARCHAR 的别名。 |
NATIONAL CHARACTER |
NCHAR |
Snowflake 的 NCHAR 是 VARCHAR 的别名。 |
NATIONAL CHARACTER VARYING |
NCHAR VARYING |
Snowflake 的 NCHAR VARYING 是 VARCHAR 的别名。 |
TEXT |
TEXT |
Snowflake 的 TEXT 是 VARCHAR 的别名。 |
NAME (https://www.postgresql.org/docs/current/datatype-character.html)(特殊字符类型) |
VARCHAR |
VARCHAR 存储 Unicode UTF-8 字符。如果未指定长度,则默认值为允许的最大长度 (16,777,216)。 |
备注
当 Redshift 数据类型中存在 MAX 精度实参时,它们将被转换为 Snowflake 支持的默认最大精度。
布尔类型 ¶
Redshift |
Snowflake |
备注 |
|---|---|---|
BOOL |
BOOLEAN |
|
BOOLEAN |
BOOLEAN |
二进制数据类型 ¶
Redshift |
Snowflake |
备注 |
|---|---|---|
VARBYTE |
VARBINARY |
VARBINARY 是 BINARY 的同义词。 |
VARBINARY |
VARBINARY |
VARBINARY 是 BINARY 的同义词。 |
BINARY |
BINARY |
最大长度为 8 MB(8,388,608 字节) |
BINARY VARYING |
BINARY VARYING |
BINARY VARYING 是 BINARY 的同义词。 |
警告
在 Redshift 中,二进制类型的最大长度为 16 MB(16,777,216 字节),但在 Snowflake 中,二进制类型的最大长度为 8 MB(8,388,608 字节)。请留意在最大长度上的减少。
日期和时间数据类型 ¶
Redshift |
Snowflake |
备注 |
|---|---|---|
DATE |
DATE |
DATE 可接受最常见的日期形式( |
TIME |
TIME |
以 |
TIMETZ |
TIME |
时间数据类型不支持时区。如需了解更多信息,请参阅 SSC-FDM-0005。 |
TIME WITH TIME ZONE |
TIME |
时间数据类型不支持时区。如需了解更多信息,请参阅 SSC-FDM-0005。 |
TIME WITHOUT TIME ZONE |
TIME |
Snowflake 支持以 |
TIMESTAMP |
TIMESTAMP |
时间戳精度的范围为 0(秒)到 9(纳秒)。 |
TIMESTAMPTZ |
TIMESTAMP_TZ |
TIMESTAMP_TZ 在内部存储 UTC 时间及关联的 时区偏移。 |
TIMESTAMP WITH TIME ZONE |
TIMESTAMP_TZ |
TIMESTAMP_TZ 在内部存储 UTC 时间及关联的 时区偏移。 |
TIMESTAMP WITHOUT TIME ZONE |
TIMESTAMP_NTZ |
TIMESTAMP_NTZ 在内部存储具有指定精度的“挂钟”时间。 |
INTERVAL YEAR TO MONTH |
VARCHAR |
Snowflake 不支持 interval 数据类型。已转换为 VARCHAR。 |
INTERVAL DAY TO SECOND |
VARCHAR |
Snowflake 不支持 interval 数据类型。已转换为 VARCHAR。 |
其他数据类型 ¶
Redshift |
Snowflake |
备注 |
|---|---|---|
GEOMETRY |
GEOMETRY |
坐标表示为实数对 (x, y)。目前,仅支持 2D 坐标。 |
GEOGRAPHY |
GEOGRAPHY |
GEOGRAPHY 数据类型遵循 WGS 84 标准。 |
HLLSKETCH |
不适用 |
Snowflake 不支持的数据类型。如需了解更多信息,请参阅 SSC-EWI-RS0004。 |
SUPER |
VARIANT |
可以包含其他任何数据类型的值,包括 OBJECT 和 ARRAY 值。 |
INTERVAL DAY TO SECOND 数据类型¶
描述¶
INTERVAL DAY TO SECOND 指定间隔字面量,以定义以天、小时、分钟和秒为单位的持续时间。(RedShift SQL 语言参考“Interval 数据类型” (https://docs.aws.amazon.com/redshift/latest/dg/r_interval_data_types.html#r_interval_data_types-syntax))
在 Snowflake 中没有该数据类型的等效项,它目前转换为 VARCHAR。
语法 ¶
INTERVAL day_to_second_qualifier [ (fractional_precision) ]
day_to_second_qualifier:
{ DAY | HOUR | MINUTE | SECOND | DAY TO HOUR | DAY TO MINUTE | DAY TO SECOND |
HOUR TO MINUTE | HOUR TO SECOND | MINUTE TO SECOND }
警告
计划在未来的更新中实现 Interval 数据类型的使用。
示例源模式¶
Create Table 中的 Interval Day to Second¶
输入¶
Redshift¶
CREATE TABLE interval_day_to_second_table
(
interval_day_col1 INTERVAL DAY TO HOUR,
interval_day_col2 INTERVAL DAY TO SECOND(4)
);
INSERT INTO interval_day_to_second_table(interval_day_col1) VALUES ( INTERVAL '1 2' DAY TO HOUR );
INSERT INTO interval_day_to_second_table(interval_day_col2) VALUES ( INTERVAL '1 2:3:4.56' DAY TO SECOND(4));
输出¶
Snowflake¶
CREATE TABLE interval_day_to_second_table
(
interval_day_col1 VARCHAR !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL DAY TO HOUR DATA TYPE CONVERTED TO VARCHAR ***/!!!,
interval_day_col2 VARCHAR !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL DAY TO SECOND(4) DATA TYPE CONVERTED TO VARCHAR ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"redshift"}}'
;
INSERT INTO interval_day_to_second_table(interval_day_col1) VALUES ('1days, 2hours');
INSERT INTO interval_day_to_second_table(interval_day_col2) VALUES ('1days, 2hours, 3mins, 4secs, 56ms');
Interval 值将转换为受支持的 Snowflake 格式,然后以文本形式插入到列中。由于 Snowflake 不支持 Interval 数据类型,因此仅在算术运算中支持这样做。若要使用该值,需要将其提取出来并用作 Interval 常量(如果可能的话)。
原始 Oracle 值: INTERVAL '1 2:3:4.567' DAY TO SECOND
存储在 Snowflake 列中的值: '1days, 2hours, 3mins, 4secs, 56ms'
作为 Snowflake Interval 常量的值: INTERVAL '1days, 2hours, 3mins, 4secs, 56ms'
从“Interval Day to Second”列检索数据¶
输入¶
Redshift¶
SELECT * FROM interval_day_to_second_table;
Result¶
interval_day_col1 |
interval_day_col2 |
|---|---|
1 days 2 hours 0 mins 0.0 secs |
NULL |
NULL |
1 days 2 hours 3 mins 4.56 secs |
输出¶
Snowflake¶
SELECT * FROM
interval_day_to_second_table;
Result¶
interval_day_col1 |
interval_day_col2 |
|---|---|
1d, 2h |
NULL |
NULL |
1d, 2h, 3m, 4s, 56ms |
已知问题¶
1.仅支持算术运算¶
Snowflake Interval 存在几项限制。仅支持 DATE 或 TIMESTAMP 与 Interval 常量 之间的算术运算,不支持其他任何场景。
相关的 EWIs¶
SSC-EWI-0036:数据类型转换为另一种数据类型。
INTERVAL YEAR TO MONTH 数据类型¶
描述¶
INTERVAL YEAR TO MONTH 指定 interval 数据类型,以存储以年和月为单位的持续时间。(RedShift SQL 语言参考“Interval 数据类型” (https://docs.aws.amazon.com/redshift/latest/dg/r_interval_data_types.html#r_interval_data_types-syntax))
在 Snowflake 中没有该数据类型的等效项,它目前转换为 VARCHAR。
语法 ¶
INTERVAL {YEAR | MONTH | YEAR TO MONTH}
警告
计划在未来的更新中实现 Interval 数据类型的使用。
示例源模式¶
Create Table 中的 Interval Year To Month¶
输入:¶
Redshift¶
CREATE TABLE interval_year_to_month_table
(
interval_year_col1 INTERVAL YEAR,
interval_year_col2 INTERVAL MONTH,
interval_year_col3 INTERVAL YEAR TO MONTH
);
INSERT INTO interval_year_to_month_table(interval_year_col1) VALUES ( INTERVAL '12' YEAR);
INSERT INTO interval_year_to_month_table(interval_year_col2) VALUES ( INTERVAL '5' MONTH);
INSERT INTO interval_year_to_month_table(interval_year_col3) VALUES ( INTERVAL '1000-11' YEAR TO MONTH );
输出¶
Snowflake¶
CREATE TABLE interval_year_to_month_table
(
interval_year_col1 VARCHAR !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL YEAR DATA TYPE CONVERTED TO VARCHAR ***/!!!,
interval_year_col2 VARCHAR !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL MONTH DATA TYPE CONVERTED TO VARCHAR ***/!!!,
interval_year_col3 VARCHAR !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL YEAR TO MONTH DATA TYPE CONVERTED TO VARCHAR ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"redshift"}}'
;
INSERT INTO interval_year_to_month_table(interval_year_col1) VALUES ('12year, 0mons');
INSERT INTO interval_year_to_month_table(interval_year_col2) VALUES ('0year, 5mons');
INSERT INTO interval_year_to_month_table(interval_year_col3) VALUES ('1000year, 11mons');
Interval 值将转换为受支持的 Snowflake 格式,然后以文本形式插入到列中。由于 Snowflake 不支持 Interval 数据类型,因此仅在算术运算中支持这样做。若要使用该值,需要将其提取出来并用作 Interval 常量(如果可能的话)。
原始 Redshift 值: INTERVAL '1-2' YEAR TO MONTH
存储在 Snowflake 列中的值: '1y, 2m'
作为 Snowflake Interval 常量的值: INTERVAL '1y, 2m'
从“Interval Year To Month”列检索数据¶
输入¶
Redshift¶
SELECT * FROM interval_year_to_month_table;
Result¶
interval_year_col1 |
interval_year_col2 |
interval_year_col2 |
|---|---|---|
12 years 0 mons |
NULL |
NULL |
NULL |
0 years 5 mons |
NULL |
NULL |
NULL |
1000 years 11 mons |
输出¶
Snowflake¶
SELECT * FROM
interval_year_to_month_table;
Result¶
interval_year_col1 |
interval_year_col2 |
interval_year_col2 |
|---|---|---|
12 y 0 mm |
NULL |
NULL |
NULL |
0 y 5 mm |
NULL |
NULL |
NULL |
1000 y 11 mons |
已知问题¶
1.仅支持算术运算¶
Snowflake Interval 存在几项限制。仅支持 DATE 或 TIMESTAMP 与 Interval 常量 之间的算术运算,不支持其他任何场景。
相关的 EWIs¶
SSC-EWI-0036:数据类型转换为另一种数据类型。
数字格式模型¶
描述¶
这些是 Redshift (https://docs.aws.amazon.com/redshift/latest/dg/r_Numeric_formating.html) 支持的不同数字格式,及其在 Snowflake 中的等效项。
Redshift |
Snowflake |
注释 |
|---|---|---|
0 |
0 |
|
9 |
9 |
|
.(句点)、D |
.(句点)、D |
|
,(逗号) |
,(逗号) |
|
CC |
目前,Snowflake 中没有 Century Code 的等效项。 |
|
FM |
FM |
|
PR |
目前,Snowflake 中没有此格式的等效格式。 |
|
S |
S |
显式数字符号。 |
L |
$ |
货币符号占位符。 |
G |
G |
|
MI |
MI |
减号(表示负数) |
PL |
S |
目前,Snowflake 中没有加号的等效符号。因此,它会被转换为显式数字符号。 |
SG |
S |
在指定位置使用显式数字符号。 |
RN |
目前,Snowflake 中没有罗马数字的等效项。 |
|
TH |
目前,Snowflake 中没有 Ordinal 后缀的等效项 |
示例源模式¶
在 To_Number 函数中的使用¶
输入:¶
Redshift¶
select to_number('09423', '999999999') as multiple_nines
, to_number('09423', '00000') as exact_zeros
, to_number('123.456', '999D999') as decimals
, to_number('123,031.30', 'FM999,999D999') as fill_mode
, to_number('$ 12,454.88', '$999,999.99') as currency
;
Results¶
| multiple_nines | exact_zeros | decimals | fill_mode | currency |
|---|---|---|---|---|
| 9423 | 9423 | 123.456 | 123031.30 | 1254.88 |
输出¶
Snowflake¶
select to_number('09423', '999999999') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''999999999'' NODE ***/!!! as multiple_nines
, to_number('09423', '00000') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''00000'' NODE ***/!!! as exact_zeros
, to_number('123.456', '999D999') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''999D999'' NODE ***/!!! as decimals
, to_number('123,031.30', 'FM999,999D999') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''FM999,999D999'' NODE ***/!!! as fill_mode
, to_number('$ 12,454.88', '$999,999.99') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''$999,999.99'' NODE ***/!!! as currency
;
Results¶
| multiple_nines | exact_zeros | decimals | fill_mode | currency |
|---|---|---|---|---|
| 9423 | 9423 | 123.456 | 123031.300 | 12454.88 |
输入:¶
Redshift¶
select to_number('$ 12,454.88', 'FML99G999D99') as currency_L
, to_number('123-', '999S') as signed_number_end
, to_number('+12454.88', 'PL99G999D99') as plus_sign
, to_number('-12,454.88', 'MI99G999D99') as minus_sign
, to_number('-12,454.88', 'SG99G999D99') as signed_number
;
Results¶
| currency_L | signed_number_end | plus_sign | minus_sign | signed_number |
|---|---|---|---|---|
| 12454.8 | -123 | 1254.88 | -12454.88 | -12454.88 |
输出:¶
Snowflake¶
select to_number('$ 12,454.88', 'FML99G999D99') !!!RESOLVE EWI!!! /*** SSC-EWI-0006 - 'FML99G999D99' FORMAT MAY FAIL OR MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/!!! as currency_L
, to_number('123-', '999S') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''999S'' NODE ***/!!! as signed_number_end
, to_number('+12454.88', 'PL99G999D99') !!!RESOLVE EWI!!! /*** SSC-EWI-0006 - 'PL99G999D99' FORMAT MAY FAIL OR MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/!!! as plus_sign
, to_number('-12,454.88', 'MI99G999D99') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''MI99G999D99'' NODE ***/!!! as minus_sign
, to_number('-12,454.88', 'SG99G999D99') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR ''SG99G999D99'' NODE ***/!!! as signed_number
;
Results¶
| currency_L | signed_number_end | plus_sign | minus_sign | signed_number |
|---|---|---|---|---|
| 12454.8 | -123 | 1254.88 | -12454.88 | -12454.88 |
在 To_Char 函数中的使用¶
输入:¶
Redshift¶
select to_char(-123, '999S') as signed_number
, to_char(12454.88, 'FM99G999D99') as decimal_number
, to_char(-12454.88, '99G999D99') as negative
, to_char(-12454.88, 'MI99G999D99') as minus_sign
, to_char(+12454.88, 'PL99G999D99') as plus_sign
, to_char(09423, '999999999') as multiple_nines
, to_char(09423, '00000') as exact_zeros
;
Results¶
| signed_number | decimal_number | negative | minus_sign | plus_sign | multiple_ninesmultiple_nines | exact_zerosexact_zeros |
|---|---|---|---|---|---|---|
| '123-' | '12,454.88' | '-12,454.88' | '12454.88' | '-12,454.88' | '09423' | '09423' |
输出:¶
Snowflake¶
select
TO_CHAR(-123, '999S') as signed_number,
TO_CHAR(12454.88, 'FM99G999D99') as decimal_number,
TO_CHAR(-12454.88, '99G999D99') as negative,
TO_CHAR(-12454.88, 'MI99G999D99') as minus_sign,
TO_CHAR(+12454.88, 'S99G999D99') as plus_sign,
TO_CHAR(09423, '999999999') as multiple_nines,
TO_CHAR(09423, '00000') as exact_zeros
;
Results¶
| signed_number | decimal_number | negative | minus_sign | plus_sign | multiple_ninesmultiple_nines | exact_zerosexact_zeros |
|---|---|---|---|---|---|---|
| '123-' | '12,454.88' | '-12,454.88' | '12454.88' | '-12,454.88' | '09423' | '09423' |
不支持的格式¶
不支持以下格式,为此将使用 EWI 对其进行标记。
输入:¶
SELECT to_char(123031, 'th999,999')
输出:¶
SELECT
TO_CHAR(123031, 'th999,999') !!!RESOLVE EWI!!! /*** SSC-EWI-0006 - th999,999 FORMAT MAY FAIL OR MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/!!!
已知问题¶
1. Using numeric signs inside the number not supported.¶
Snowflake 不支持在数字中间(而非数字开头或结尾)使用任何数字符号格式(MI、SG 或 PL)。
示例
select to_number('12,-454.88', '99GMI999D99')
相关的 EWIs¶
SSC-EWI-0006: The current date/numeric format may have a different behavior in Snowflake.