数据类型 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

数据类型

Amazon Redshift 存储或检索的每个值都具有包含一组固定关联属性的数据类型。数据类型是在创建表时声明的。数据类型约束了列或参数可包含的一组值。

下表列出了您可在 Amazon Redshift 表中使用的数据类型。

数据类型 别名 说明
SMALLINT INT2 有符号的二字节整数
INTEGER INT、INT4 有符号的四字节整数
BIGINT INT8 有符号的八字节整数
DECIMAL NUMERIC 可选精度的精确数字
REAL FLOAT4 单精度浮点数
DOUBLE PRECISION FLOAT8、FLOAT 双精度浮点数
BOOLEAN BOOL 逻辑布尔值(true/false)
CHAR CHARACTER、NCHAR、BPCHAR 固定长度字符串
VARCHAR CHARACTER VARYING、NVARCHAR、TEXT 具有用户定义的限制的可变长度字符串,
DATE 日历日期(年、月、日)
TIMESTAMP TIMESTAMP WITHOUT TIME ZONE 日期和时间(没有时区)
TIMESTAMPTZ TIMESTAMP(有时区) 日期和时间(有时区)
GEOMETRY 空间数据
HLLSKETCH 用于 HyperLogLog 草图的类型。
TIME TIME WITHOUT TIME ZONE Time of day
TIMETZ 带时区的时间 Time of day with time zone
注意

有关不支持的数据类型的信息,例如“char”(注意 char 用引号括起来),请参阅不支持的 PostgreSQL 数据类型

多字节字符

VARCHAR 数据类型支持多达 4 个字节的 UTF-8 多字节字符。不支持 5 个字节或更长的字符。要计算包含多字节字符的 VARCHAR 列的大小,请用字符数乘以每个字符的字节数。例如,如果一个字符串包含四个中文字符,并且每个字符的长度为三个字节,则您需要一个 VARCHAR(12) 列才能存储该字符串。

VARCHAR 不支持下列无效的 UTF-8 代码点:

  • 0xD800 - 0xDFFF

    (字节序列:ED A0 80 - ED BF BF)

  • 0xFDD0 - 0xFDEF、0xFFFE 和 0xFFFF

    (字节序列:EF B7 90 - EF B7 AF、EF BF BE 和 EF BF BF)

CHAR 数据类型不支持多字节字符。

类型兼容性和转换

您可以在下面找到关于类型转换规则和数据类型兼容性如何在 Amazon Redshift 中工作的讨论。

Compatibility

在各种数据库操作期间,将会出现数据类型匹配以及文本值和常量与数据类型的匹配,包括以下情况:

  • 表中的数据操控语言 (DML) 操作

  • UNION、INTERSECT 和 EXCEPT 查询

  • CASE 表达式

  • 谓词(如 LIKE 和 IN)的计算

  • 执行数据比较或提取的 SQL 函数的计算

  • 数学运算符的比较

这些运算的结果取决于类型转换规则和数据类型兼容性。兼容性 意味着并非总是需要特定值和特定数据类型的一对一匹配。由于一些数据类型是兼容的,因此可进行隐式转换或强制转换(更多信息请参阅隐式转换类型)。如果数据类型不兼容,您有时可通过使用显式转换函数将值从一种数据类型转换为另一种数据类型。

一般兼容性和转换规则

请注意下列兼容性和转换规则:

  • 一般来说,同属一种类型类别的数据类型(如不同的数字数据类型)是兼容的并且可隐式转换。

    例如,通过使用隐式转换,您可以将一个小数值插入整数列。小数进位为整数。或者,您可以从日期中提取一个数字值(如 2008)并将其插入到整数列中。

  • 数字数据类型强制实施将在您尝试插入超出范围的值时出现的溢出条件。例如,精度为 5 的小数值无法放入到精度定义为 4 的小数列中。绝不会截断整数或小数的整数部分;但是,小数的小数部分可以视情况进行向上或向下取整。但是,对于显示强制转换表中选定的值而得出的结果,不会进行四舍五入。

  • 不同类型的字符串是兼容的;包含单字节数据的 VARCHAR 列字符串和 CHAR 列字符串是兼容且可隐式转换的。包含多字节数据的 VARCHAR 字符串是不可兼容的。此外,如果字符串是适当的文本值,则您可以将字符串转换为日期、时间、时间戳或数字值;将忽略任何前导或尾部空格。反过来,您也可以将日期、时间、时间戳或数字值转换为固定长度或可变长度的字符串。

    注意

    您要强制转换为数字类型的字符串必须包含数字的字符表示形式。例如,您可将字符串 '1.0''5.9' 强制转换为小数值,但无法将字符串 'ABC' 强制转换为任何数字类型。

  • 如果您将数值与字符串进行比较,则数值将转换为字符串。若要强制实施相反转换(将字符串转换为数值),请使用显式函数(如 CAST 和 CONVERT)。

  • 若要将 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
TIMETZ VARCHAR
TIME
注意

在 TIMESTAMPTZ、TIMESTAMP、DATE、TIME、TIMETZ 或字符串之间的隐式转换使用当前会话时区。有关设置当前时间地区的信息,请参阅 timezone

无法将 GEOMETRY 数据类型隐式转换为任何其他数据类型。有关更多信息,请参阅CAST 和 CONVERT 函数

对 SUPER 数据类型使用动态键入

Amazon Redshift 使用动态键入处理无 schemal SUPER 数据,无需在查询中使用数据类型之前声明数据类型。动态键入使用导航到 SUPER 数据列的结果,而无需将其显式转换为 Amazon Redshift 类型。有关为 SUPER 数据类型使用动态键入的更多信息,请参阅动态键入

您可以将 SUPER 值转换为其他数据类型或从其他数据类型进行转换,但存在一些例外情况。有关更多信息,请参阅Limitations