我有2个数据库,我想将包含CHAR列的现有表从数据库A传输到数据库B.

数据库A是Oracle 9i,编码为WE8ISO8859P1,并包含一个表“foo”。至少有一列CHAR类型(1个字符)。我无法更改数据库A上的表,因为它是第三方设置的一部分。

数据库B是我自己的Oracle 10g数据库,由于各种原因使用编码AL32UTF8,我想将foo复制到这个数据库中。

我设置了从数据库B到数据库A的数据库链接。然后我发出以下命令:

*从#link#.foo; *

创建表格栏作为select *

数据被很好地复制,但是当我检查列的类型时,我注意到CHAR(1个字符)已经转换为CHAR(3个字符),当查询数据库B中的数据时,它全部都是用空格填充。

我认为在水下某处,Oracle会混淆它自己的字节和字符。 CHAR(1个字节)与CHAR(1个字符)等不同。我已经阅读了所有这些。

为什么数据类型会变为填充CHAR(3个字符),如何阻止Oracle执行此操作?

编辑:这似乎与在Oracle 9和10的两个特定补丁级别之间传输CHAR有关。看起来它确实是一个错误。一发现我就会发布更新。同时:不要像我描述的那样尝试在数据库之间移动CHAR。 VARCHAR2工作正常(已测试)。

编辑2:我找到了答案并将其发布在此处: 为什么在通过Oracle DBLINK复制时Char(1)更改为Char(3)? 太糟糕了,我不能接受我自己的答案,因为我的问题已经解决了。

有帮助吗?

解决方案

此问题是由Oracle(mis)基于原始列长度定义处理不同字符集之间的字符转换的方式引起的。当您以字节为单位定义字符类型列的大小时,Oracle不知道如何进行转换并对其进行提交。 解决方案是始终以字符定义字符类型的长度。

有关问题的更深入解释以及我如何解决这个问题 http://www.rolfje.com / 2008/11/04 /输送-Oracle的字符悬停-A-DBLINK /

其他提示

你需要了解WE8ISO8859P1 NLS(存储一个字节中的字符)和AL32UTF8之间的区别,后者存储最多四个字节的字符。您将需要花费一些时间与Oracle国家语言支持(NLS)文档。 Oracle会自动通过数据库链接进行转换,以帮助您。

从SQL提示符处尝试以下操作:

ALTER SESSION NLS_NCHAR WE8ISO8859P1 
create table bar as select * from #link#.foo;

我要尝试的第一件事是创建表不是作为CTAS,而是使用列定义列表并尝试执行前几千行的插入。如果这没有成功,那么很明显为什么......而且你很快就会确认Thomas Low的准确性已经死了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top