我目前正在将系统从Oracle 11g迁移到12c。
11g服务器(源)使用WE8MSWIN1252字符集, 12c服务器(目标)使用AL32UTF8字符集。
我们使用EXP和IMP来传输一个模式的数据。德语变音符号没有正确转移。此外,一些字段对于目标而言变得太长,因为它们通过UTF表示会变得更长。
使用imp / exp实现正确无损转换的EXP和IMP的正确设置是什么?
提前致谢!
答案 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;
是的,'Ö'没有转换,我在数据库中找不到任何内容,因为只有少数德语单词以'ö'开头,更少的是大写; - )
也许这种方法可以解决任何遇到同样问题的人的快速解决方法。