数据类型
Amazon Redshift 存储或检索的每个值都具有包含一组固定关联属性的数据类型。数据类型是在创建表时声明的。数据类型约束了列或参数可包含的一组值。
下表列出了您可在 Amazon Redshift 表中使用的数据类型。
数据类型 | 别名 | 描述 |
---|---|---|
SMALLINT | INT2 | 有符号的二字节整数 |
INTEGER | INT、INT4 | 有符号的四字节整数 |
BIGINT | INT8 | 有符号的八字节整数 |
DECIMAL | NUMERIC | 可选精度的精确数字 |
REAL | FLOAT4 | 单精度浮点数 |
DOUBLE PRECISION | FLOAT8、FLOAT | 双精度浮点数 |
CHAR | CHARACTER、NCHAR、BPCHAR | 固定长度字符串 |
VARCHAR | CHARACTER VARYING、NVARCHAR、TEXT | 具有用户定义的限制的可变长度字符串, |
DATE | 日历日期(年、月、日) | |
TIME | TIME WITHOUT TIME ZONE | Time of day |
TIMETZ | 带时区的时间 | Time of day with time zone |
TIMESTAMP | TIMESTAMP WITHOUT TIME ZONE | 日期和时间(没有时区) |
TIMESTAMPTZ | TIMESTAMP(有时区) | 日期和时间(有时区) |
INTERVAL YEAR TO MONTH | 按年到月顺序排列的持续时间 | |
INTERVAL DAY TO SECOND | 按日到秒顺序排列的持续时间 | |
BOOLEAN | BOOL | 逻辑布尔值 (true/false) |
HLLSKETCH | 用于 HyperLogLog 草图的类型。 | |
SUPER | 一种超集数据类型,包含 Amazon Redshift 的所有标量类型,包括 ARRAY 和 STRUTS 等复杂类型。 | |
VARBYTE | VARBINARY,二进制可变 | 长度可变的二进制值 |
GEOMETRY | 空间数据 | |
GEOGRAPHY | 空间数据 |
注意
有关不支持的数据类型的信息,例如“char”(注意 char 用引号括起来),请参阅不支持的 PostgreSQL 数据类型。
多字节字符
VARCHAR 数据类型支持多达 4 个字节的 UTF-8 多字节字符。不支持 5 个字节或更长的字符。要计算包含多字节字符的 VARCHAR 列的大小,请用字符数乘以每个字符的字节数。例如,如果一个字符串包含四个中文字符,并且每个字符的长度为三个字节,则您需要一个 VARCHAR(12) 列才能存储该字符串。
VARCHAR 数据类型不支持下列无效的 UTF-8 代码点:
0xD800 – 0xDFFF
(字节序列:ED A0 80
– ED BF BF
)
CHAR 数据类型不支持多字节字符。
类型兼容性和转换
您可以在下面找到关于类型转换规则和数据类型兼容性如何在 Amazon Redshift 中工作的讨论。
兼容性
在各种数据库操作期间,将会出现数据类型匹配以及文本值和常量与数据类型的匹配,包括以下情况:
-
表中的数据操控语言 (DML) 操作
-
UNION、INTERSECT 和 EXCEPT 查询
-
CASE 表达式
-
谓词(如 LIKE 和 IN)的计算
-
执行数据比较或提取的 SQL 函数的计算
-
数学运算符的比较
这些运算的结果取决于类型转换规则和数据类型兼容性。兼容性 意味着并非总是需要特定值和特定数据类型的一对一匹配。由于一些数据类型是兼容的,因此可进行隐式转换或强制转换(更多信息请参阅隐式转换类型)。如果数据类型不兼容,您有时可通过使用显式转换函数将值从一种数据类型转换为另一种数据类型。
一般兼容性和转换规则
请注意下列兼容性和转换规则:
-
一般来说,同属一种类型类别的数据类型(如不同的数字数据类型)是兼容的并且可隐式转换。
例如,通过使用隐式转换,您可以将一个小数值插入整数列。小数进位为整数。或者,您可以从日期中提取一个数字值(如
2008
)并将其插入到整数列中。 -
数字数据类型强制实施将在您尝试插入超出范围的值时出现的溢出条件。例如,精度为 5 的小数值无法放入到精度定义为 4 的小数列中。绝不会截断整数或小数的整数部分;但是,小数的小数部分可以视情况进行向上或向下取整。但是,对于显示强制转换表中选定的值而得出的结果,不会进行四舍五入。
-
不同类型的字符串是兼容的;包含单字节数据的 VARCHAR 列字符串和 CHAR 列字符串是兼容且可隐式转换的。包含多字节数据的 VARCHAR 字符串是不可兼容的。此外,如果字符串是适当的文本值,则您可以将字符串转换为日期、时间、时间戳或数字值;将忽略任何前导或尾部空格。反过来,您也可以将日期、时间、时间戳或数字值转换为固定长度或可变长度的字符串。
注意
您要强制转换为数字类型的字符串必须包含数字的字符表示形式。例如,您可将字符串
'1.0'
或'5.9'
强制转换为小数值,但无法将字符串'ABC'
强制转换为任何数字类型。 -
如果您将 DECIMAL 值与字符串进行比较,Amazon Redshift 会尝试将字符串转换为 DECIMAL 值。在将所有其他数值与字符串进行比较时,数值将转换为字符串。如果要强制进行相反的转换(例如,将字符串转换为正数,或者将 DECIMAL 值转换为字符串),请使用显式函数,例如 CAST。
-
若要将 64 位 DECIMAL 或 NUMERIC 值转换为更高的精度,必须使用显式转换函数(如 CAST 或 CONVERT)。
-
将 DATE 或 TIMESTAMP 转换为 TIMESTAMPTZ 时,或者将 TIME 转换为 TIMETZ 时,时区设置为当前会话时区。会话时区默认为 UTC。有关设置会话时区的更多信息,请参阅 timezone。
-
与之类似,TIMESTAMPTZ 可根据当前会话时区转化为 DATE、TIME 或 TIMESTAMP。会话时区默认为 UTC。转换后,时区信息将被删除。
-
使用当前会话时区(默认为 UTC)将代表有指定时区的时间戳的字符串转换为 TIMESTAMPTZ。使用当前会话时区(默认为 UTC)将代表有指定时区的时间的字符串转换为 TIMETZ。
隐式转换类型
有两种隐式转换类型:
-
分配中的隐式转化,如 INSERT 或 UPDATE 命令中的设置值。
-
表达式中的隐式转化,例如在 WHERE 子句中执行比较。
下表列出了在赋值或表达式中可隐式转换的数据类型。您还可使用显式转换函数执行这些转换。
源类型 | 目标类型 |
---|---|
BIGINT (INT8) | BOOLEAN |
CHAR | |
DECIMAL (NUMERIC) | |
DOUBLE PRECISION (FLOAT8) | |
INTEGER (INT, INT4) | |
REAL (FLOAT4) | |
SMALLINT (INT2) | |
VARCHAR | |
CHAR | VARCHAR |
DATE | CHAR |
VARCHAR | |
TIMESTAMP | |
TIMESTAMPTZ | |
DECIMAL (NUMERIC) | BIGINT (INT8) |
CHAR | |
DOUBLE PRECISION (FLOAT8) | |
INTEGER (INT, INT4) | |
REAL (FLOAT4) | |
SMALLINT (INT2) | |
VARCHAR | |
DOUBLE PRECISION (FLOAT8) | BIGINT (INT8) |
CHAR | |
DECIMAL (NUMERIC) | |
INTEGER (INT, INT4) | |
REAL (FLOAT4) | |
SMALLINT (INT2) | |
VARCHAR | |
INTEGER (INT, INT4) | BIGINT (INT8) |
BOOLEAN | |
CHAR | |
DECIMAL (NUMERIC) | |
DOUBLE PRECISION (FLOAT8) | |
REAL (FLOAT4) | |
SMALLINT (INT2) | |
VARCHAR | |
REAL (FLOAT4) | BIGINT (INT8) |
CHAR | |
DECIMAL (NUMERIC) | |
INTEGER (INT, INT4) | |
SMALLINT (INT2) | |
VARCHAR | |
SMALLINT (INT2) | BIGINT (INT8) |
BOOLEAN | |
CHAR | |
DECIMAL (NUMERIC) | |
DOUBLE PRECISION (FLOAT8) | |
INTEGER (INT, INT4) | |
REAL (FLOAT4) | |
VARCHAR | |
TIMESTAMP | CHAR |
DATE | |
VARCHAR | |
TIMESTAMPTZ | |
TIME | |
TIMESTAMPTZ | CHAR |
DATE | |
VARCHAR | |
TIMESTAMP | |
TIMETZ | |
TIME | VARCHAR |
TIMETZ | |
INTERVAL DAY TO SECOND | |
TIMETZ | VARCHAR |
TIME | |
GEOMETRY | GEOGRAPHY |
GEOGRAPHY | GEOMETRY |
注意
对 SUPER 数据类型使用动态键入
Amazon Redshift 使用动态键入处理无 schemal SUPER 数据,无需在查询中使用数据类型之前声明数据类型。动态键入使用导航到 SUPER 数据列的结果,而无需将其显式转换为 Amazon Redshift 类型。有关为 SUPER 数据类型使用动态键入的更多信息,请参阅动态键入。
您可以将 SUPER 值转换为其他数据类型或从其他数据类型进行转换,但存在一些例外情况。有关更多信息,请参阅 限制。