AnalyticDB PostgreSQL版支持多種數據導入方法,在通過OSS高速并行導入和通過\COPY命令導入數據的過程中,經常因為存在特殊字符導致導入失敗。本文將介紹預先處理導入數據中的特殊字符的方法,從而消除特殊字符帶來的問題。

更多導入數據到AnalyticDB PostgreSQL版的方案,請參見數據遷移及同步方案綜述

OSS高速并行導入

在數據導入過程中,一般是將文件的每行作為一個元組,通過在每行中規定分隔符來分割每一列的數據。下文將介紹分隔符的使用方法和約束,以及每列中遇到特殊符號的處理方法。

分隔符

在創建OSS外部表語法中,您可以通過在FORMAT子句后面指定DELIMITER分隔符,如下:

FORMAT 'TEXT' (DELIMITER ',')
  • 如果FORMAT 'TEXT',則DELIMITER缺省值為'\t'
  • 如果FORMAT 'CSV',則DELIMITER缺省值為','

您也可以自定義DELIMITER,但是創建外部表語法中自定義的DELIMITER必須滿足以下約束:

  • 必須是一個ASCII字符,不允許是漢字或者2個以及以上ASCII字符。
  • 不支持'\n''\r'
  • 支持除'\n''\r'之外的其他轉義字符,使用時前面加E或者e。
  • 支持前面不加E的轉義字符'\t'
  • 如果是TEXT模式,可以設置DELIMITER為OFF,支持單列外部表。

為了能夠正常讀取數據,您提供的OSS文件內容必須嚴格遵守設置的DELIMITER。

數據中的特殊符號

在數據導入過程中,出現特殊符號的場景可以分為以下幾種:

  • 列中存在和DELIMITER相同的字符。
    • 如果您使用TEXT模式,則需要在每個DELIMITER字符前加ESCAPE符。ESCAPE符可以在創建外表時使用以下命令指定,缺省值為反斜杠(\)。
      FORMAT 'TEXT' (ESCAPE '\' )
    • 如果您使用的是CSV模式,則需要在每個DELIMITER字符前加雙引號(”)。
  • 列中存在中文。OSS外表支持中文數據,但是為了保證顯示正確,您需要在創建外表時設置如下編碼格式:
    ENCODING 'UTF8'
  • 列中存在null。您可以設置null對應的匹配字符,在導入數據時將對應的字符匹配為null。CSV模式下缺省值為不帶引號的空值,TEXT模式下缺省值為\N。以下命令將空格作為null的匹配字符,如果該列為空格,則在使用OSS文件導入的數據中該列值為null。
    FORMAT 'text' (null ' ' )
  • 列中存在轉義字符。您可以在轉義字符前增加ESCAPE符。ESCAPE符在創建外表時指定,CSV模式缺省值為雙引號(”),TEXT模式缺省值為反斜杠(\)。
    • 您可以自定義ESCAPE為單個字符。例如,以下命令將ESCAPE設置為反斜杠:
      FORMAT 'csv' (ESCAPE '\' )
    • 您也可以設置ESCAPE為OFF,避免所有字符被自動轉義。
  • 列中存在單引號或者雙引號。
    • 如果您使用TEXT模式,需要在單引號或者雙引號前面增加ESCAPE符,默認為反斜杠(\)。
    • 如果您使用CSV模式,需要在單引號或者雙引號前面增加ESCAPE符,默認為雙引號(”),同時在該列前后加雙引號(”),將整列括起來。

\COPY數據導入

您在使用\COPY命令導入數據時,分隔符的使用方法和OSS高速并行導入時的使用方法一樣,而對數據中出現特殊符號的處理方法也和OSS高速并行導入相類似。不同的是\COPY命令和CREATE EXTERNAL TABLE語句用法略有不同,\COPY命令詳細用法見使用\COPY命令導入本地數據