Saat ini saya memigrasikan sistem dari Oracle 11g ke 12c.

Server 11g (Sumber) menggunakan set karakter WE8MSWIN1252, Server 12c (Target) menggunakan set karakter AL32UTF8.

Kami menggunakan EXP dan IMP untuk mentransfer data untuk satu skema. Umlaut Jerman tidak ditransfer dengan benar. Juga beberapa bidang menjadi terlalu panjang untuk target karena semakin panjang melalui representasi UTF.

Apa pengaturan yang benar untuk EXP dan IMP untuk mencapai konversi yang benar dan lossless dengan imp/exp?

Terima kasih sebelumnya!

1
MichaSchumann 10 Maret 2017, 15:19

2 jawaban

Jawaban Terbaik

Saya mencoba semua NLS_Settings yang berbeda, konversi pengaturan meta tidak berhasil. Kemudian saya menemukan bahwa beberapa tabel memiliki umlaut yang benar setelah migrasi, beberapa memiliki dua karakter khas seperti "ü" untuk bahasa Jerman "ü".

Karena aplikasi bekerja dengan baik pada database lama, saya menduga bahwa karena kesalahan dalam versi aplikasi yang lebih lama, beberapa umlaut dikodekan ke titik kode berbeda yang menghasilkan karakter yang sama tetapi dipecah melalui proses migrasi.

Solusi sederhana yang saya temukan adalah membuat blok PL/SQL kecil yang mengoreksi semua umlaut di semua bidang varchar di semua tabel. Ini adalah solusi yang agak kasar tetapi karena bereksperimen dengan IMP/EXP membutuhkan waktu yang sangat lama, ini adalah cara yang paling layak untuk menyelesaikan masalah saya dalam waktu yang wajar.

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;

Dan ya, tidak ada konversi untuk 'Ö', saya tidak menemukannya di database karena hanya beberapa kata Jerman yang dimulai dengan 'ö' dan bahkan lebih sedikit yang dikapitalisasi ;-)

Mungkin pendekatan ini dapat memecahkan sebagai perbaikan cepat bagi siapa saja yang mengalami masalah yang sama.

0
MichaSchumann 11 Maret 2017, 15:28

Untuk mengubah kumpulan karakter database, lakukan langkah-langkah berikut:

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;

Perhatikan bahwa skrip CSALTER tidak melakukan konversi data pengguna apa pun. Itu hanya mengubah metadata set karakter dalam kamus data. Dengan demikian, setelah operasi CSALTER, Oracle akan berperilaku seolah-olah database dibuat menggunakan set karakter baru.

0
Peter R 10 Maret 2017, 12:47