Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

类型兼容性和转换

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

兼容性

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

  • 表中的数据操控语言 (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 时,DATE 或 TIMESTAMP 假设为使用当前会话时区。会话时区默认为 UTC。有关设置会话时区的更多信息,请参阅 timezone

  • 与之类似,TIMESTAMPTZ 可根据当前会话时区转化为 DATE 或 TIMESTAMP。会话时区默认为 UTC。转换后,时区信息将被删除。

  • 使用指定的时区将代表有指定时区的时间戳的字符串转换为 TIMESTAMPTZ。如果时区被省略,则使用当前会话时区(默认为 UTC)。

隐式转换类型

有两种隐式转换类型:

  • 分配中的隐式转化,如 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
TIMESTAMPTZ CHAR
DATE
VARCHAR
TIMESTAMP

注意

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