【发布时间】:2011-12-18 18:51:56
【问题描述】:
我在尝试从 sql server 迁移到 oracle 时遇到了一个奇怪的问题。
在我的一张表中,我有由NVARCHAR(255) 定义的列
读了一点后,我了解到当 oracle 计算字节时,SQL 服务器正在计算字符。
所以我在 oracle 中将我的表定义为 VARCHAR(510) 255*2 = 510
但是,当使用 sqlldr 从制表符分隔的文本文件中加载数据时,我收到错误消息,表明某些条目已超出此列的长度。
使用以下方法签入 sql 服务器后:
SELECT MAX(DATALENGTH(column))
FROM table
我知道最大数据长度是 510。
我确实使用了希伯来语_CI_AS 排序规则,即使我认为它不会改变任何东西.... 如果任何条目包含 TAB 但没有,我也检查了 SQL Server……所以我猜它不是损坏的数据…… 有人有想法吗?
编辑 经过进一步检查,我注意到问题是由于数据文件引起的(除了@Justin Cave 帖子解决的问题。
我已将行分隔符更改为“^”,因为我的数据都不包含此字符和“|^|”作为列分隔符。
如下创建控制文件:
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 感谢您为我解决了这个问题,但我不明白它如何解决我的问题.... :(
-
它不能解决你的问题——这就是为什么我把它作为评论而不是作为答案。
标签: sql-server oracle migration varchar nvarchar