Oracle

外部表:創建中的 VARCHAR 但訪問參數中的 CHAR

  • January 29, 2019

考慮這個 SO Question UTF-8 And External Tables。建議的解決方案在 CREATE 部分中包含 VARCHAR2 列,但這些相同的列在 ACCESS PARAMETERS 部分中獲得 CHAR 屬性。

為什麼有區別?

在此處輸入圖像描述

數據庫內部的數據類型和 SQL*Loader 或 ORACLE_LOADER 驅動程序使用的數據類型不同。

SQL*Loader 不知道 VARCHAR2 數據類型。它有一個 VARCHAR 類型,但該類型是不可移植的,這意味著它依賴於平台。

SQL*Loader 數據類型

VARCHAR 欄位只能在 SHORT 數據欄位 INT 具有相同字節長度的系統之間載入正確結果。如果系統之間的字節順序不同,或者如果 VARCHAR 欄位包含 UTF16 字元集中的數據,則使用適當的技術來指示長度子欄位和數據的字節順序。數據的字節順序只是 UTF16 字元集的問題。

SQL*Loader 的 CHAR 類型是可移植的。

可移植數據類型

可移植數據類型分為值數據類型和長度值數據類型。可移植值數據類型如下:

字元

日期時間和間隔

形象的

圖形外部

數字外部(整數、浮點數、十進制、分區)

生的

可移植的長度值數據類型如下:

VARARC

VARRAWC

使用非攜帶式類型,您可能會也可能無法在不同平台上傳入數據:

跨不同平台載入數據

當在一個平台上創建的數據文件要載入到不同的平台上時,數據必須以目標系統可以讀取的形式寫入。例如,如果源系統具有使用 16 字節的本機浮點表示,而目標系統的浮點數為 12 字節,則目標系統無法直接讀取源系統上生成的數據。

最好的解決方案是通過 Oracle Net 數據庫連結載入數據,利用數據類型的自動轉換。這是推薦的方法,只要可行,這意味著 SQL*Loader 必須在源系統上執行。

跨平台載入問題通常發生在本機數據類型上。在某些情況下,可以通過用零填充欄位來延長欄位來避免問題,或者只讀取欄位的一部分來縮短它(例如,當要在使用 8 字節整數的系統上讀取4 字節整數,或相反)。但是請注意,不兼容的數據類型實現可能會阻止這種情況。

如果您不能使用 Oracle Net 數據庫連結並且數據文件必須由執行在目標系統上的 SQLLoader 訪問,那麼建議只使用可移植的 SQLLoader 數據類型(例如,CHAR、DATE、VARCHARC 和數字外部)。

引用自:https://dba.stackexchange.com/questions/228376