類型相容性與轉換 - AWS Clean Rooms

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

類型相容性與轉換

下列討論說明類型轉換規則和資料類型相容性在中的運作方式 AWS Clean Rooms。

相容性

在資料庫各種操作的作業期間,會進行資料類型的比對,以及字面值與常數和資料類型的比對,包括下列的操作:

  • 對資料表進行的資料處理語言 (DML) 操作

  • UNION、INTERSECT 和 EXCEPT 查詢

  • CASE 表達式

  • 述詞的評估,例如 LIKE 和 IN

  • 針對進行資料比較或擷取的 SQL 函式,進行評估

  • 數學運算子的比較

這些操作的結果,取決於類型轉換規則和資料類型的相容性。兼容性意味著並不總是需要 one-to-one 匹配某個值和特定數據類型。由於某些資料類型相容,因此可能會隱含轉換或強制轉換。如需詳細資訊,請參閱 隱含轉換類型。當資料類型不相容時,有時您可以使用明確的轉換函式,來將值從一種資料類型轉換為另一種。

一般相容性與轉換規則

請注意下列的相容性與轉換規則:

  • 一般而言,屬於相同類型類別的資料類型 (例如不同的數值資料類型),彼此可以相容和隱含轉換。

    例如,進行隱含轉換時,您可以將小數值插入整數資料欄。小數會經過四捨五入而變成整數。或者,您可以從日期中擷取 2008 等數值,然後將該數值插入整數資料欄。

  • 數值資料類型會強制執行嘗試插入 out-of-range 值時發生的溢位情況。例如,精確度為 5 的小數值,不符合精確度定義為 4 的小數資料欄。整數或小數的整數部分永遠不會被截斷。但是,小數的小數部分可以適當地向上或向下四捨五入。不過,從資料表所選取值的明確轉換結果,不會四捨五入。

  • 不同類型的字符串是兼容的。包含單字節數據和 CHAR 列字符串的 VARCHAR 列字符串是可比較的和隱式轉換的。包含多位元組資料的 VARCHAR 字串並不相容。此外,如果字串是適當的常值,您可以將字元字串轉換為日期、時間戳記或數值。任何前導或尾隨空格都會被忽略。相反地,您也可以將日期、時間、時間戳記或數值,轉換為固定長度或可變長度的字元字串。

    注意

    您想要轉換為數值類型的字元字串,必須包含表示數字的字元。例如,您可以將字串'1.0'轉換'5.9'為十進位值,但無法'ABC'將字串轉換為任何數值類型。

  • 如果您比較 DECIMAL 值與字元字串,會 AWS Clean Rooms 嘗試將字元字串轉換為 DECIMAL 值。比較所有其他數值和字元字串時,數值會轉換為字元字串。若要強制執行相反的轉換 (例如,將字元字串轉換為整數,或將 DECIMAL 值轉換為字元字串),請使用明確函數,例如 CAST 函數

  • 若要將 64 位元的 DECIMAL 或 NUMERIC 值轉換為較高的精確度,您必須使用明確轉換函式,例如 CAST 或 CONVERT 函式。

  • 將 DATE 或 TIMESTAMP 轉換為 TIMESTAMPTZ,或將 TIME 轉換為 TIMETZ 時,時區會設定為目前的工作階段時區。工作階段預設的時區為 UTC。

  • 同樣地,TIMESTAMPTZ 轉換為 DATE、TIME 或 TIMESTAMP 時,也會使用目前工作階段的時區。工作階段預設的時區為 UTC。在轉換之後,會去掉時區的資訊。

  • 用來表示指定時區之時間戳記的字元字串,會使用目前工作階段時區 (預設為 UTC) 轉換為 TIMESTAMPTZ。同樣地,代表指定時區之時間的字元字串,也會使用目前的工作階段時區 (預設為 UTC) 轉換為 TIMETZ。

隱含轉換類型

隱含轉換有兩種:

  • 指派中的隱含轉換,例如在 INSERT 或 UPDATE 命令中設定值

  • 運算式中的隱含轉換,例如在 WHERE 子句中執行比較

下表列出可在指派或運算式中隱含轉換的資料類型。您也可以使用明確轉換函式來進行這些轉換。

轉換前的類型 轉換後的類型
BIGINT BOOLEAN
CHAR
DECIMAL (NUMERIC)
DOUBLE PRECISION (FLOAT8)
INTEGER
REAL (FLOAT4)
SMALLINT
VARCHAR
CHAR VARCHAR
DATE CHAR
VARCHAR
TIMESTAMP
TIMESTAMPTZ
DECIMAL (NUMERIC) BIGINT
CHAR
DOUBLE PRECISION (FLOAT8)
整數)
REAL (FLOAT4)
SMALLINT
VARCHAR
DOUBLE PRECISION (FLOAT8) BIGINT
CHAR
DECIMAL (NUMERIC)
整數(整數)
REAL (FLOAT4)
SMALLINT
VARCHAR
整數(整數) BIGINT
BOOLEAN
CHAR
DECIMAL (NUMERIC)
DOUBLE PRECISION (FLOAT8)
REAL (FLOAT4)
SMALLINT
VARCHAR
REAL (FLOAT4) BIGINT
CHAR
DECIMAL (NUMERIC)
整數(整數)
SMALLINT
VARCHAR
SMALLINT BIGINT
BOOLEAN
CHAR
DECIMAL (NUMERIC)
DOUBLE PRECISION (FLOAT8)
整數(整數)
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 或字元字串之間的隱含轉換,會使用目前工作階段的時區。

VARBYTE 資料類型無法隱含轉換至任何其他資料類型。如需更多詳細資訊,請參閱 CAST 函數