我们正在将遗留应用程序ascii迁移到unicode,作为此活动的一部分,我们需要将数据类型从varchar2更改为nvarchar2,以便它可以接受不同的字符。我正在尝试为一个表和一个列(使用alter table脚本)测试此活动,并且由于表保存数据(13,81,67,254行)所花费的时间超过15分钟。存在大约200个表(每个表具有大约25列具有varchar2数据类型)并且为了完成该活动,将花费大量时间并且我们不能承受如此多的停机时间。有没有办法更快地执行此操作? DB - Oracle 10 g
编辑问题 - 有什么办法可以避免将数据类型从varchar2转换为nvarchar2吗?在BYTES中定义的Curretnly varchar2范围,例如 - varchar2(3 BYTE)。
数据库详细信息 -
答案 0 :(得分:1)
尝试
alter table modify <column_name> varchar2(4 char)
这应该是在没有人注意的实时系统上可行的。 4 char应该足以存储Unicode亚洲字符。
答案 1 :(得分:1)
我建议使用最新的Oracle数据迁移助手(DMU)。这是一个链接:
但是了解Unicode(这并不复杂)也是一件好事。查看Wiki以更好地理解Unicode。
我同意那些评论说使用默认的基于unicode的字符集最有意义的人,这样你就可以使用varchar了,你不需要nvarchar。
转化的一个问题是尺寸。假设你有varchar2(3)的声明。此声明意味着您可以存储最多3个字节,非unicode等于3个字符,因为每个字符只占用一个字节。但是在unicode中,一个字符可能占用超过一个字节。您可以将声明更改为varchar2(3 CHAR),然后它将适用于unicode。您还可以将varchar2的数据库默认值更改为CHAR而不是BYTE。在任何一种情况下,您仍然有最大的字节问题需要处理。 varchar2的最大字节数为4000(除非您升级到Oracle 12c,在这种情况下,您可以将最大数量更改为32767字节)。在任何情况下,如果您有varchar2(4000 char)声明,您可能会或可能无法插入4000个unicode字符。如果在unicode编码中用一个字节表示所有字符(例如,如果它们是ascii字符),则只能插入那么多个字符。在AL32UTF中,所有字符占用1-4个字节。因此,这意味着如果使用varchar2(1000 CHAR)声明,即使所有字符都有4个字节的编码,也可以保证最多1000个字符。
我还建议将默认的nls_length_semantics更改为CHAR。这样varchar2(n)意味着最多可以存储n个字符,不管n个字符所需的字节数(只要它少于4000个字节)。