Oracle 11g到Oracle 12c字符集转换(转储)

时间:2017-03-10 12:19:22

标签: oracle oracle11g character-encoding oracle12c utf

我目前正在将系统从Oracle 11g迁移到12c。

11g服务器(源)使用WE8MSWIN1252字符集, 12c服务器(目标)使用AL32UTF8字符集。

我们使用EXP和IMP来传输一个模式的数据。德语变音符号没有正确转移。此外,一些字段对于目标而言变得太长,因为它们通过UTF表示会变得更长。

使用imp / exp实现正确无损转换的EXP和IMP的正确设置是什么?

提前致谢!

2 个答案:

答案 0 :(得分:0)

要更改数据库字符集,请执行以下步骤:

1.Shut down the database, using either a SHUTDOWN IMMEDIATE or a SHUTDOWN NORMAL statement.

2.Do a full backup of the database, because the CSALTER script cannot be rolled back.

3.Start up the database.

4.Run the Database Character Set Scanner utility.
CSSCAN /AS SYSDBA FULL=Y...

5.Run the CSALTER script.
@@CSALTER.PLB
SHUTDOWN IMMEDIATE; -- or SHUTDOWN NORMAL;
STARTUP;

请注意,CSALTER脚本不会执行任何用户数据转换。它只会更改数据字典中的字符集元数据。因此,在CSALTER操作之后,Oracle的行为就像使用新字符集创建数据库一样。

答案 1 :(得分:0)

我尝试了所有不同的NLS_Settings,转换元设置无济于事。后来我发现有些表在迁移后有正确的变音符号,有些表具有典型的两个字符,如德语“ü”的“¼”。

由于应用程序在旧数据库上运行良好,我怀疑由于旧版本应用程序中的错误,一些变音符号被编码到不同的代码点,导致相同的字符,但在迁移过程中被分开。 / p>

我找到的简单解决方案是创建一个小的PL / SQL块,用于纠正所有表中所有varchar字段的所有变音符号。这是一种蛮力的解决方案,但由于试验IMP / EXP需要很长时间,这是在合理的时间内解决我的问题最可行的方法。

begin
  for c in (select a.table_name,b.column_name from all_tables a 
  left join all_tab_columns b on a.table_name=b.table_name and b.owner='<myschema>'
  where a.owner = '<myschema>' 
  and (b.data_type='VARCHAR2' or b.data_type='VARCHAR'))
  loop
    execute immediate 'update ' || c.table_name ||
    ' set ' || c.column_name || '=
      replace(
        replace(
          replace(
             replace(
               replace(
                 replace(' || c.column_name || ',''Ä'',''Ä''),
               ''ä'',''ä''),
             ''ü'',''ü''),
          ''ß'',''ß''),
       ''Ãœ'',''Ü''),
     ''ö'',''ö'')';
  end loop;
end;

是的,'Ö'没有转换,我在数据库中找不到任何内容,因为只有少数德语单词以'ö'开头,更少的是大写; - )

也许这种方法可以解决任何遇到同样问题的人的快速解决方法。