本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
資料類型
Amazon Redshift 所儲存或擷取的每個值,都具有資料類型,而資料類型具有一組固定的相關屬性。資料類型會在資料表建立時宣告,用來限制欄或引數可包含的一組值。
下表列出您可以在 Amazon Redshift 中使用的資料類型。
資料類型 | Aliases | 描述 |
---|---|---|
SMALLINT | INT2 | 帶正負號的 2 位元組整數 |
INTEGER | INT、INT4 | 帶正負號的 4 位元組整數 |
BIGINT | INT8 | 帶正負號的 8 位元組整數 |
DECIMAL | NUMERIC | 可選擇精確度 (有效位數) 的精確數值 |
REAL | FLOAT4 | 單精度浮點數 |
DOUBLE PRECISION | FLOAT8、FLOAT | 雙精度浮點數 |
CHAR | CHARACTER、NCHAR、BPCHAR | 固定長度的字元字串 |
VARCHAR | CHARACTER VARYING、NVARCHAR、TEXT | 可變長度的字元字串 (使用者定義的限制) |
DATE | 日曆日期 (年、月、日) | |
TIME | TIME WITHOUT TIME ZONE | 一天中的時間 |
TIMETZ | TIME WITH TIME ZONE | 一天中的時間,含時區 |
TIMESTAMP | TIMESTAMP WITHOUT TIME ZONE | 日期和時間 (未使用時區) |
TIMESTAMPTZ | TIMESTAMP WITH TIME ZONE | 日期和時間 (包含時區) |
INTERVAL YEAR TO MONTH | 一年到月訂單的持續時間 | |
INTERVAL DAY TO SECOND | 從天到第二順序的持續時間 | |
BOOLEAN | BOOL | 邏輯布林值 (true/false) |
HLLSKETCH | 與 HyperLogLog 草圖一起使用的類型。 | |
SUPER | 超集資料類型,包含 Amazon Redshift 的所有純量類型,包括複雜類型 (例如 ARRAY 和 STRUCTS)。 | |
VARBYTE | VARBINARY、BINARY VARYING | 可變長度二進位值 |
GEOMETRY | 空間資料 | |
GEOGRAPHY | 空間資料 |
注意
如需 "char" (請注意,char 會用引號括住) 等不支援資料類型的相關資訊,請參閱不支援的 PostgreSQL 資料類型。
多位元組字元
VARCHAR 資料類型支援最多 4 個位元組的 UTF-8 多位元組字元,不支援 5 個位元組或更長的字元。若要針對包含多位元組字元的 VARCHAR 資料欄,計算其大小,請將字元數乘以每個字元的位元組數。例如,如果字串包含 4 個中文字,而每個字的長度是 3 個位元組,那麼您將需要使用 VARCHAR(12) 資料欄來儲存這個字串。
VARCHAR 資料類型不支援下列無效的 UTF-8 碼位:
0xD800 – 0xDFFF
(位元組序列:ED A0 80
- ED BF BF
)
CHAR 資料類型不支援多位元組字元。
類型相容性與轉換
接下來的內容將會說明在 Amazon Redshift 中,類型轉換規則與資料類型相容性的運作方式。
相容性
在資料庫各種操作的作業期間,會進行資料類型的比對,以及字面值與常數和資料類型的比對,包括下列的操作:
-
對資料表進行的資料處理語言 (DML) 操作
-
UNION、INTERSECT 和 EXCEPT 查詢
-
CASE 表達式
-
述詞的評估,例如 LIKE 和 IN
-
針對進行資料比較或擷取的 SQL 函式,進行評估
-
數學運算子的比較
這些操作的結果,取決於類型轉換規則和資料類型的相容性。兼容性意味著並不總是需要 one-to-one 匹配某個值和特定數據類型。由於某些資料類型是相容的,因此可進行隱含轉換或強制轉換 (如需詳細資訊,請參閱 隱含轉換類型)。當資料類型不相容時,有時您可以使用明確的轉換函式,來將值從一種資料類型轉換為另一種。
一般相容性與轉換規則
請注意下列的相容性與轉換規則:
-
一般而言,屬於相同類型類別的資料類型 (例如不同的數值資料類型),彼此可以相容和隱含轉換。
例如,進行隱含轉換時,您可以將小數值插入整數資料欄。小數會經過四捨五入而變成整數。或者,您可以從日期中擷取
2008
等數值,然後將該數值插入整數資料欄。 -
數值資料類型會強制執行嘗試插入 out-of-range 值時發生的溢位情況。例如,精確度為 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 會使用動態類型來處理無結構描述的 SUPER 資料,無需在查詢中使用資料類型之前先宣告資料類型。動態類型會使用導覽至 SUPER 資料欄的結果,而不必明確地將它們轉換為 Amazon Redshift 類型。如需將動態類型用於 SUPER 資料類型的相關資訊,請參閱動態類型。
您可以將 SUPER 值與其他資料類型互相轉換,但有一些例外情況。如需詳細資訊,請參閱 限制。