3

我在尝试从 sql server 迁移到 oracle 时遇到了一个奇怪的问题。在我的一个表中,我有一个列定义为NVARCHAR(255) 在读了一点之后我明白当 oracle 计算字节时 SQL 服务器正在计算字符。所以我在 oracle 中将我的表定义为VARCHAR(510)255*2 = 510 但是当使用 sqlldr 从制表符分隔的文本文件中加载数据时,我收到错误消息,表明某些条目已超过此列的长度。使用以下命令签入 sql server 后:

SELECT MAX(DATALENGTH(column))
FROM table

我知道最大数据长度是 510。

我确实使用了希伯来语_CI_AS collat​​iong,即使我认为它没有任何改变......一个想法?

编辑 经过进一步检查,我注意到问题是由于数据文件造成的(除了@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>!!!我不想更改数据,因为它是文本数据(例如错误消息)。

4

2 回答 2

5

你的数据库字符集是什么

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

假设您的数据库字符集是 AL32UTF8,每个字符可能需要最多 4 个字节的存储空间(尽管几乎每个有用的字符最多可以用 3 个字节的存储空间表示)。因此,您可以声明您的专栏VARCHAR2(1020)以确保您有足够的空间。

您也可以简单地使用字符长度语义。如果您声明您的 column VARCHAR2(255 CHAR),无论需要多少空间,您都将为 255 个字符分配空间。如果将NLS_LENGTH_SEMANTICS初始化参数从默认 BYTE 更改为 CHAR,您将更改默认值,以便将VARCHAR2(255)其解释为VARCHAR2(255 CHAR)而不是VARCHAR2(255 BYTE). VARCHAR2请注意,即使您使用字符长度语义,a 的 4000 字节限制仍然存在。

如果您的数据包含换行符,您是否需要该TRAILING NULLCOLS参数?这意味着有时可能会从逻辑行的末尾省略列。如果您将可能被省略的列与包含换行符的列和未由至少一个可选的包围字符包围的数据的列组合在一起,那么对我来说,您将如何开始识别逻辑行的结束位置和开始位置并不明显。如果您实际上不需要该TRAILING NULLCOLS参数,您应该能够使用CONTINUEIF 参数将多个物理行组合成一个逻辑行。如果您可以更改数据文件格式,我强烈建议您添加可选的附件字符。

于 2011-10-31T14:27:11.840 回答
-1

字段使用的字节NVARCHAR数等于字符数的两倍二(请参阅http://msdn.microsoft.com/en-us/library/ms186939.aspx),因此如果您将VARCHAR字段设为 512,您可能会好的。还有一些迹象表明某些字符集每个字符使用 4 个字节,但我没有发现希伯来语是这些字符集之一的迹象。

于 2011-10-31T14:24:51.670 回答