gpt4 book ai didi

sql-server - 从 sql server 迁移到 Oracle varchar 长度问题

转载 作者:行者123 更新时间:2023-12-01 12:58:59 26 4
gpt4 key购买 nike

我在尝试从 sql server 迁移到 oracle 时遇到了一个奇怪的问题。在我的一张表中,我的列由 NVARCHAR(255) 定义阅读了一下之后,我明白 SQL Server 在 Oracle 计算字节时计算字符。所以我在 oracle 中将我的表定义为 VARCHAR(510) 255*2 = 510但是,当使用 sqlldr 从制表符分隔的文本文件中加载数据时,出现错误,表明某些条目超出了该列的长度。使用以下命令检查 sql server 后:

SELECT MAX(DATALENGTH(column))
FROM table

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

我确实使用 Hebrew_CI_AS collat​​iong,尽管我认为它不会改变任何东西......我还检查了 SQL Server 是否有任何条目包含 TAB 但没有......所以我猜它不是损坏的数据......有人有想法吗?

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

最佳答案

你的数据库字符集是什么

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将多个物理行组合成一个逻辑行。如果您可以更改数据文件格式,我强烈建议您添加一个可选的封闭字符。

关于sql-server - 从 sql server 迁移到 Oracle varchar 长度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7954884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com