gpt4 book ai didi

oracle - 为什么在复制 Oracle DBLINK 时 Char(1) 变为 Char(3)?

转载 作者:行者123 更新时间:2023-12-01 11:10:40 25 4
gpt4 key购买 nike

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

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

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

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

*create table bar as select * from #link#.foo;*

数据被很好地复制过来,但是当我检查列的类型时,我注意到 CHAR(1 char) 已转换为 CHAR(3 char),并且在数据库 B 中查询数据时,它是所有用空格填充。

我认为在水下某处,Oracle 混淆了它自己的字节和字符。 CHAR(1 byte) 不同于 CHAR(1 char) 等。我已经阅读了所有相关内容。

为什么数据类型变为填充的 CHAR(3 个字符),我如何阻止 Oracle 这样做?

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

编辑 2:我找到了答案并将其发布在这里: Why does Char(1) change to Char(3) when copying over an Oracle DBLINK?太糟糕了,我不能接受我自己的答案,因为我的问题已经解决了。

最佳答案

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

要更深入地解释问题以及我是如何解决这个问题的,请查看 http://www.rolfje.com/2008/11/04/transporting-oracle-chars-over-a-dblink/

关于oracle - 为什么在复制 Oracle DBLINK 时 Char(1) 变为 Char(3)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/253971/

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