資料轉換參數 - Amazon Redshift

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

資料轉換參數

COPY 載入資料表時會嘗試隱含地將來源資料中的字串轉換為目標欄的資料類型。如果您需要指定不同於預設行為的轉換,或預設轉換造成錯誤,您可以指定下列參數來管理資料轉換。

資料轉換參數

ACCEPTANYDATE

允許載入任何日期格式而不會產生錯誤,包括無效格式,例如 00/00/00 00:00:00。此參數僅適用於 TIMESTAMP 和 DATE 欄。ACCEPTANYDATE 一定要與 DATEFORMAT 參數一起使用。如果資料的日期格式不符合 DATEFORMAT 規格,Amazon Redshift 會在該欄位中插入 NULL 值。

ACCEPTINVCHARS [AS] ['replacement_char']

即使資料包含無效 UTF-8 字元,也允許將資料載入 VARCHAR 欄。指定 ACCEPTINVCHARS 時,COPY 會以 replacement_char 指定之字元所組成相同長度的字串,取代每個無效 UTF-8 字元。例如,假設替換字元是 '^',則會以 '^^^' 取代無效的三位元組字元。

替換字元可以是 NULL 除外的任何 ASCII 字元。預設值為問號 (? 。 如需無效 UTF-8 字元的相關資訊,請參多位元組字元載入錯誤

COPY 會傳回包含無效 UTF-8 字元的列數,並針對每個受影響的列,在 STL_REPLACEMENTS 系統資料表中新增一筆項目,而每個節點配量最多 100 列。也會取代其他無效 UTF-8 字元,但不會記錄那些取代事件。

如果不指定 ACCEPTINVCHARS,COPY 只要遇到無效 UTF-8 字元就會傳回錯誤。

ACCEPTINVCHARS 僅適用於 VARCHAR 欄。

BLANKSASNULL

將只包含空格字元的空白欄位載入為 NULL。此選項僅適用於 CHAR 和 VARCHAR 欄。一律會將其他資料類型 (例如 INT) 的空白欄位載入為 NULL。例如,會將包含連續三個空白字元 (沒有其他任何字元) 的字串載入為 NULL。預設行為 (不使用此選項時) 是依原狀載入空白字元。

DATEFORMAT [AS] {'dateformat_string' | 'auto' }

如果不指定 DATEFORMAT,則預設格式為 'YYYY-MM-DD'。例如,另一種有效格式為 'MM-DD-YYYY'

如果 COPY 命令無法辨識日期或時間值的格式,或者,日期或時間值使用不同的格式,請使用 'auto' 引數來搭配 DATEFORMAT 或 TIMEFORMAT 參數。'auto' 引數可以辨識使用 DATEFORMAT 和 TIMEFORMAT 字串時不支援的多種格式。'auto' 關鍵字區分大小寫。如需詳細資訊,請參閱 對 DATEFORMAT 和 TIMEFORMAT 使用自動辨識

日期格式可以包含時間資訊 (時、分、秒),但此資訊會遭到忽略。AS 關鍵字為選用。如需詳細資訊,請參閱 DATEFORMAT 和 TIMEFORMAT 字串

EMPTYASNULL

指出 Amazon Redshift 應該將空的 CHAR 和 VARCHAR 欄位載入為 NULL。其他資料類型 (例如 INT) 的空欄位一律載入為 NULL。當資料包含連續兩個分隔符號,且分隔符號之間沒有字元時,就形成空欄位。EMPTYASNULL 和 NULL AS '' (空字串) 會引起相同的行為。

ENCODING [AS] file_encoding

指定載入資料的編碼類型。COPY 命令會於載入期間將資料從指定的編碼轉換為 UTF-8。

file_encoding 的有效值如下所示:

  • UTF8

  • UTF16

  • UTF16LE

  • UTF16BE

預設為 UTF8

來源檔案名稱必須使用 UTF-8 編碼。

即使對載入資料指定不同的編碼,下列檔案仍必須使用 UTF-8 編碼:

  • 資訊清單檔案

  • JSONPaths 檔案

下列參數隨附的引數字串必須使用 UTF-8:

  • FIXEDWIDTH 'fixedwidth_spec'

  • ACCEPTINVCHARS 'replacement_char'

  • DATEFORMAT 'dateformat_string'

  • TIMEFORMAT 'timeformat_string'

  • NULL AS 'null_string'

固定寬度資料檔案必須使用 UTF-8 編碼。欄位寬度是根據字元數,而不是位元組數。

所有載入資料必須使用指定的編碼。如果 COPY 遇到不同的編碼,則會略過檔案並傳回錯誤。

如果您指定 UTF16,則資料必須有位元組順序標記 (BOM)。如果知道您的 UTF-16 資料是位元組由小到大 (LE) 或位元組由大到小 (BE),則不論是否有 BOM,您都可以使用 UTF16LEUTF16BE

ESCAPE

指定此參數時,輸入資料中的反斜線字元 (\) 就視為逸出字元。反斜線字元後面緊接的字元即使通常做為特殊用途,一樣會載入資料表中成為目前欄值的一部分。例如,當分隔符號字元、引號、內嵌的換行符號字元或逸出字元本身是欄值的正當部分時,您可以使用此參數來逸出這些字元。

如果同時指定 ESCAPE 參數和 REMOVEQUOTES 參數,您可以逸出並保留原本可能移除的引號 ('")。預設 null 字串 (\N) 不受影響,但也可以在輸入資料中以 \\N 逸出。只要不以 NULL AS 參數指定替代 null 字串,\N\\N 會產生相同的結果。

注意

控制字元0x00(NUL) 不能轉義,應該從輸入資料中移除或轉換。此字元視為記錄結束 (EOR) 標記,用於截斷記錄的剩餘部分。

您不能對 FIXEDWIDTH 載入使用 ESCAPE 參數,也不能指定逸出字元本身;逸出字元始終是反斜線字元。您還必須確定輸入資料包含的逸出字元是在適當的位置。

以下一些範例示範輸入資料,以及指定 ESCAPE 參數時載入的資料結果。第 4 列的結果假設也指定 REMOVEQUOTES 參數。輸入資料由縱線分隔的兩個欄位組成:

1|The quick brown fox\[newline] jumped over the lazy dog. 2| A\\B\\C 3| A \| B \| C 4| 'A Midsummer Night\'s Dream'

載入第 2 欄的資料如下所示:

The quick brown fox jumped over the lazy dog. A\B\C A|B|C A Midsummer Night's Dream
注意

使用者必須負責將逸出字元套用至載入的輸入資料。當您重新載入先前以 ESCAPE 參數來卸載的資料時,此規定就沒有必要。在此情況下,資料一定包含必要的逸出字元。

ESCAPE 參數不會解譯八進位、十六進位、Unicode 或其他逸出序列標記法。例如,如果源數據包含八進制換行值(\012),並嘗試使用 ESCAPE 參數加載此數據,Amazon Redshift 會加載值012添加到表中,並且不會將此值解釋為正在轉義的換行符。

在源自 Microsoft Windows 平台的資料中,若要逸出新行字元,您可能需要使用兩個逸出字元:一個用於換行字元,另一個用於新行字元。或者,您可以在載入檔案之前移除換行字元 (例如,使用 dos2unix 公用程式)。

EXPLICIT_IDS

對於有 IDENTITY 欄的資料表,如果您想要以資料表的來源資料檔案中的明確值來覆寫自動產生的值,請使用 EXPLICIT_IDS。如果命令包含欄清單,則此清單必須包含 IDENTITY 欄,才能使用此參數。EXPLICIT_IDS 值的資料格式必須符合 CREATE TABLE 定義所指定的 IDENTITY 格式。

在您對具有 EXPLICIT_IDS 選項的資料表執行 COPY 命令之後,Amazon Redshift 將不再檢查資料表中的 IDENTITY 欄的唯一性。

如果資料欄是使用 GENERATED BY DEFAULT AS IDENTITY 定義的,則可以複製它。值是利用您提供的值來產生或更新。EXPLICIT_IDS 不是必要選項。COPY 不會更新身分高浮水印。

FILLRECORD

當某些記錄的結尾缺少連續的欄時,允許載入資料檔案。缺少的列將作為空值加載。對於文本和 CSV 格式,如果缺少的列是 VARCHAR 列,則加載零長度字符串而不是 NULL。要從文本和 CSV 將空值加載到 VARCHAR 列,請指定 EMPTYASNULL 關鍵字。只有在欄定義允許 NULL 時,才會進行 NULL 替換。

例如,假設資料表定義包含四個可為 Null 的 CHAR 欄,且有一筆記錄包含值 apple, orange, banana, mango,則 COPY 命令可以載入並填入只包含值 apple, orange 的記錄。會將缺少的 CHAR 值載入為 NULL 值。

IGNOREBLANKLINES

忽略資料檔案中只含有換行字元的空白行,而不嘗試載入這些空白行。

IGNOREHEADER [ AS ] number_rows

將指定的 number_rows 視為檔案標頭而不載入。使用 IGNOREHEADER 來略過平行載入之所有檔案中的檔案標頭。

NULL AS 'null_string'

將符合 null_string 的欄位載入為 NULL,其中 null_string 可以是任何字串。如果資料包含 null 結束字元 (也稱為 NUL (UTF-8 0000) 或二進位零 (0x000)),COPY 會將此字元視為任何其他字元。例如,包含 '1' || NUL || '2' 的記錄被複製為長度為 3 個字節的字符串。如果欄位只包含 NUL,您可以使用 NULL AS 將 null 結束符替換為 NULL,方法是指定'\0'或者'\000'— 例如,NULL AS '\0'或者NULL AS '\000'。如果欄位包含以 NUL 結尾的字串,且指定 NULL AS,則會在字串結尾插入 NUL。請勿對空字符串值。Amazon Redshift 會保留 '\ n' 作為行分隔符號使用。預設 null_string'\N'。

注意

如果嘗試將 null 載入己定義為 NOT NULL 的欄,COPY 命令會失敗。

REMOVEQUOTES

在傳入的資料中移除括住字串的引號。引號內的所有字元 (包括分隔符號) 都會保留。如果字串有起始單引號或雙引號,但沒有對應的結束標記,則 COPY 命令無法載入此列,且會傳回錯誤。下表以一些簡單的範例示範含有引號的字串及結果載入的值。

輸入字串 以 REMOVEQUOTES 選項載入的值
"分隔符號是縱線 (|) 字元" 分隔符號是縱線 (|) 字元
'黑色' 黑色
"白色" 白色
藍色' 藍色'
藍色' 不會載入值:錯誤情況
"藍色 不會載入值:錯誤情況
' ' '黑色' ' ' ' '黑色' '
' ' <white space>
ROUNDEC

當輸入值的小數位數超過欄的小數位數時,將數值四捨五入。根據預設,COPY 會視需要截斷值,以符合欄的小數位數。例如,假設將值 20.259 載入 DECIMAL(8,2) 欄,COPY 預設會將值截斷為 20.25。如果指定 ROUNDEC,則 COPY 會將值四捨五入為 20.26。INSERT 命令一律會視需要將值四捨五入,以符合欄的小數位數,因此,COPY 命令搭配 ROUNDEC 參數的行為就如同 INSERT 命令。

TIMEFORMAT [AS] {'timeformat_string' | 'auto' | 'epochsecs' | 'epochmillisecs' }

指定時間格式。如果不指定 TIMEFORMAT,則 TIMESTAMP 欄的預設格式為 YYYY-MM-DD HH:MI:SS,TIMESTAMPTZ 欄的預設格式為 YYYY-MM-DD HH:MI:SSOF,其中 OF 是國際標準時間 (UTC) 的時差。timeformat_string 中不可包含時區指標。若要載入不是預設格式的 TIMESTAMPTZ 資料,請指定 'auto';如需詳細資訊,請參閱對 DATEFORMAT 和 TIMEFORMAT 使用自動辨識。如需 timeformat_string 的詳細資訊,請參閱 DATEFORMAT 和 TIMEFORMAT 字串

'auto' 引數可以辨識使用 DATEFORMAT 和 TIMEFORMAT 字串時不支援的多種格式。如果 COPY 命令無法辨識日期或時間值的格式,或者,日期和時間值使用彼此不同的格式,請使用 'auto' 引數來搭配 DATEFORMAT 或 TIMEFORMAT 參數。如需詳細資訊,請參閱 對 DATEFORMAT 和 TIMEFORMAT 使用自動辨識

如果來源資料以 ecpch 時間表示,亦即,自 1970 年 1 月 1 日 00:00:00 UTC 以來的秒數或毫秒數,請指定 'epochsecs''epochmillisecs'

'auto''epochsecs''epochmillisecs' 關鍵字區分大小寫。

AS 關鍵字為選用。

TRIMBLANKS

從 VARCHAR 字串中移除尾端空格字元。此參數僅適用於 VARCHAR 資料類型的欄。

TRUNCATECOLUMNS

將欄的資料截斷為適當的字元數,以符合欄規格。僅適用於 VARCHAR 或 CHAR 資料類型的欄,以及大小為 4 MB 或更小的列。