資料類型 - Amazon Redshift

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

資料類型

Amazon Redshift 儲存或檢索的每個值,都具有資料類型,而資料類型具有一組固定的相關屬性。資料類型會在資料表建立時宣告,用來限制欄或引數可包含的一組值。

下表列出您可用於 Amazon Redshift 資料表中的資料類型。

資料類型 別名 描述
SMALLINT INT2 帶正負號的 2 位元組整數
INTEGER INT、INT4 帶正負號的 4 位元組整數
BIGINT INT8 帶正負號的 8 位元組整數
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 WITH TIME ZONE 日期和時間 (包含時區)
GEOMETRY 空間資料
GEOGRAPHY 空間資料
高階草圖 與 HyperLogLog 草圖一起使用的類型。
超級 一種超集數據類型,包含 Amazon Redshift 的所有標量類型,包括複雜類型(如 ARRAY 和結構)。
TIME 沒有時區的時間 一天當中的時間
時間 TIME WITH TIME ZONE 具時區的時間
變量字節 變量二進制,二進制變化 可變長度二進制值
注意

如需 "char" (請注意,char 會用引號括住) 等不支援資料類型的相關資訊,請參閱不支援的 PostgreSQL 資料類型

多位元組字元

VARCHAR 資料類型支援最多 4 個位元組的 UTF-8 多位元組字元,不支援 5 個位元組或更長的字元。若要針對包含多位元組字元的 VARCHAR 資料欄,計算其大小,請將字元數乘以每個字元的位元組數。例如,如果字串包含 4 個中文字,而每個字的長度是 3 個位元組,那麼您將需要使用 VARCHAR(12) 資料欄來儲存這個字串。

VARCHAR 資料類型不支援下列無效的 UTF-8 代碼點:

0xD800 – 0xDFFF(字節序列:ED A0 80ED BF BF)

CHAR 資料類型不支援多位元組字元。

類型相容性與轉換

下列的內容將會討論如何在 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 或 TIMESTAMPTZ 轉換為 TIMESTAMPTZ 時,會將 TIMESTAMPTZ 設置為目前工作階段的時區。工作階段預設的時區為 UTC。關於設定工作階段的時區,詳細資訊請參閱 timezone

  • 同樣地,TIMESTAMPTZ 轉換為 DATE、TIMESTAMPTZ 時,也會使用目前工作階段的時區。工作階段預設的時區為 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
時間
TIME VARCHAR
時間
時間 VARCHAR
TIME
GEOMETRY GEOGRAPHY
GEOGRAPHY GEOMETRY
注意

TIMESTAMPTZ、TIMESTAMPTZ、TIMESTAMPTZ 或字元字串之間的隱含轉換,會使用目前工作階段的時區。關於設定目前的時區,詳細資訊請參閱 timezone

除了彼此以外,GEOMETRY 資料類型和地理位置資料類型無法隱含轉換為任何其他資料類型。如需詳細資訊,請參閱 CAST 和 CONVERT 函數

VARBYTY 資料類型無法隱含轉換為任何其他資料類型。如需詳細資訊,請參閱 CAST 和 CONVERT 函數

對 SUPER 數據類型使用動態類型

Amazon Redshift 使用動態類型來處理模式 SUPER 數據,而無需在查詢中使用數據類型之前聲明這些數據類型。動態類型使用導航到 SUPER 數據列的結果,而無需明確地將它們轉換為 Amazon Redshift 類型。如需將 SUPER 資料類型使用動態類型的詳細資訊,請參動態類型

您可以將 SUPER 值轉換到其他數據類型或從其他數據類型中轉換出來,但 如需詳細資訊,請參閱 限制