我正面臨着一個奇怪的問題,試圖從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甚至collationg但我不認爲它改變了什麼.... 我檢查在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>
!!!!我不想更改數據,因爲它的文本數據(例如錯誤消息)。
您可能會遇到的另一個問題:Oracle認爲空白(零長度)字符串與NULL相同,而SQL Server認爲它們不同。因此,如果原始SQL Server數據庫具有包含空白的非NULL字段,則無法將此數據遷移到Oracle版本(除非您在Oracle版本中刪除了非NULL約束)。 – MusiGenesis
@MusiGenesis感謝您爲我節省了這個問題,但我沒有看到它是如何解決我的問題.... :( –
它不能解決您的問題 - 這就是爲什麼我把它作爲一個評論,而不是作爲答案。 – MusiGenesis