2011-10-31 48 views
3

我正面臨着一個奇怪的問題,試圖從sql server遷移到oracle。 在我的一個表中,我有NVARCHAR(255) 定義的列後,我讀了一點我知道SQL服務器正在計數字符,當oracle計數字節。 所以我在oracle中定義了我的表爲VARCHAR(510) 255 * 2 = 510 但是,當使用sqlldr加載來自制表符的delimetered文本文件中的數據時,出現en錯誤,指示某些條目已經刪除了此列的長度。 使用在SQL Server檢查後:從SQL Server遷移到Oracle varchar長度問題

SELECT MAX(DATALENGTH(column)) 
FROM table 

我得到最大的數據長度爲510

我使用Hebrew_CI_AS甚至collat​​iong但我不認爲它改變了什麼.... 我檢查在SQL Server中,如果任何條目包含TAB但沒有...所以我想它不是一個損壞的數據.... 任何人有一個想法?

編輯 進一步檢查後,我發現,這個問題是由於數據文件(除由@Justin洞後解決了問題。

我已經改變了行分隔符爲「^ 「因爲沒有我的數據包含了這個角色‘|^|’作爲列分隔符

創建一個控制文件如下:

load data 
infile data.txt "str '^'" 
badfile "data_BAD.txt" 
discardfile "data_DSC.txt" 
into table table 
FIELDS TERMINATED BY '|^|' TRAILING NULLCOLS 
(
    col1, 
    col2, 
    col3, 
    col4, 
    col5, 
    col6 
) 

的問題是,我的數據包含<CR>和sqlldr期待在那裏的流文件失敗<CR> !!!!我不想更改數據,因爲它的文本數據(例如錯誤消息)。

+0

您可能會遇到的另一個問題:Oracle認爲空白(零長度)字符串與NULL相同,而SQL Server認爲它們不同。因此,如果原始SQL Server數據庫具有包含空白的非NULL字段,則無法將此數據遷移到Oracle版本(除非您在Oracle版本中刪除了非NULL約束)。 – MusiGenesis

+0

@MusiGenesis感謝您爲我節省了這個問題,但我沒有看到它是如何解決我的問題.... :( –

+0

它不能解決您的問題 - 這就是爲什麼我把它作爲一個評論,而不是作爲答案。 – MusiGenesis

回答

5

什麼是你的數據庫字符集

SELECT parameter, value 
    FROM v$nls_parameters 
WHERE parameter LIKE '%CHARACTERSET' 

假設你的數據庫字符集是AL32UTF8,每個字符可能需要多達4個字節的存儲空間(雖然幾乎每一個有用的角色可以與最多3個字節表示的存儲)。所以你可以聲明你的列爲VARCHAR2(1020),以確保你有足夠的空間。

你也可以簡單地使用字符長度語義。如果您聲明瞭列VARCHAR2(255 CHAR),則無論需要多少空間,您都將爲255個字符分配空間。如果將NLS_LENGTH_SEMANTICS初始化參數從默認BYTE更改爲CHAR,則將更改默認值,以便VARCHAR2(255)被解釋爲VARCHAR2(255 CHAR)而不是VARCHAR2(255 BYTE)。請注意,即使您使用字符長度語義,VARCHAR2上的4000字節限制仍然存在。

如果您的數據包含換行符,那麼您是否需要TRAILING NULLCOLS參數?這意味着有時可能會從邏輯行的末尾省略列。如果將包含換行符的列和不包含至少一個可選附件字符的數據組合在一起的列可能被省略,則對於我而言,如何開始確定邏輯行的結束位置和開始位置並不明顯。如果您實際上不需要TRAILING NULLCOLS參數,則應該可以使用CONTINUEIF parameter將多個物理行組合到一個邏輯行中。如果您可以更改數據文件格式,我強烈建議添加可選的機箱字符。

+1

警告:「獨立於字符的最大長度,VARCHAR2數據的長度不能超過4000字節。」 .oracle.com/docs/cd/E11882_01/server.112/e26088/sql_elements001.htm#i45694換句話說,'varchar2(2000 char)'不能包含2000個字符,其中每個字符長度爲3個字節。 –

+0

@Justin Cave請查看我編輯過的帖子 –

+0

@NoamShaish - 將多個物理記錄合併爲一個邏輯記錄的新增信息。將來,您可能需要單獨詢問問題而不是編輯你最初的問題,如果你要求一個非常不同的後續行動。有一個專門討論VARCHAR2長度問題的問題,以及一個致力於使用SQL * Loader將多個物理行組合成單個邏輯行的問題可能會更清晰。 –

-1

NVARCHAR領域使用的字節等於字符兩(見http://msdn.microsoft.com/en-us/library/ms186939.aspx)的數量的兩倍,因此,如果你讓你VARCHAR場512你可能會確定。還有一些跡象表明,某些字符集每個字符使用4個字節,但我沒有發現希伯來文是這些字符集之一。

+0

長度字節不會計算在'* char *'字符串的定義大小中 –