Masalah Impor Oracle disebabkan oleh rangkaian karakter yang berbeda

11

Saya mencoba mengimpor ekspor Oracle 11 ke Oracle 11 XE.

Saya mendapatkan pesan-pesan berikut:

impor di XE fehlerhaft impor dilakukan di set karakter WE8MSWIN1252 dan AL16UTF16 NCHAR set karakter
server impor menggunakan set karakter AL32UTF8 (kemungkinan konversi charset)

Ada ide, bagaimana saya bisa mengimpor dump ini ke Oracle 11 XE?

Edit:

Diberikan meja

CREATE TABLE BDATA.Artikel(
    Key                   VARCHAR2(3)  NOT NULL,
    Name                  VARCHAR2(60) NOT NULL,
    Abkuerzung            VARCHAR2(5)  NOT NULL
);

Saya mendapatkan kesalahan seperti ini

IMP-00019: row rejected due to ORACLE error 12899
IMP-00003: ORACLE error 12899 encountered
ORA-12899: value too large for column "BDATA"."ARTIKEL"."ABKUERZUNG" (actual: 6, maximum: 5)
Column 1 ABL
Column 2 Aufbewahrungslösung
Column 3 AfbLö

Beberapa baris tidak ada dari impor.

bernd_k
sumber

Jawaban:

8

Jika itu adalah DDL aktual yang Anda gunakan untuk membuat tabel, Anda bisa menggunakan parameter NLS_LENGTH_SEMANTICS . Jika Anda mengaturnya menjadi CHAR daripada default BYTE, sebuah VARCHAR2 (5) akan dialokasikan ruang yang cukup untuk menyimpan 5 karakter dalam set karakter basis data (berpotensi hingga 20 byte) daripada 5 byte (yang dapat memungkinkan hanya 1 karakter ).

Sayangnya, mengubah NLS_LENGTH_SEMANTICSmungkin tidak akan sangat membantu jika Anda mengandalkan proses impor untuk membuat tabel - file dump akan secara inheren menambahkan kata kunci CHAR atau BYTE sehingga benar-benar akan mengeluarkan pernyataan

CREATE TABLE BDATA.Artikel(
    Key                   VARCHAR2(3 BYTE)  NOT NULL,
    Name                  VARCHAR2(60 BYTE) NOT NULL,
    Abkuerzung            VARCHAR2(5 BYTE)  NOT NULL
);
Gua Justin
sumber
Saya memiliki skrip buat tabel dan dapat memodifikasinya sesuai dengan proposal Anda. Jika imp berfungsi ketika tabel sudah dibuat, semua akan baik-baik saja.
bernd_k
@bernd_k - Keren. Kemudian Anda dapat mengatur NLS_LENGTH_SEMANTICS sebelum menjalankan DDL atau Anda dapat memodifikasi DDL untuk menambahkan CHAR ke setiap deklarasi kolom VARCHAR2. Ketika Anda melakukan impor, Anda hanya harus mengatakannya untuk mengabaikan kegagalan pernyataan CREATE TABLE karena tabel sudah ada.
Justin Cave
Saya mengubah definisi tabel saya ... VARCHAR2 (60 CHAR) BUKAN NULL ... dan menggunakan IMP dengan IGNORE = Y dan Impor berhasil diakhiri dengan peringatan.
bernd_k
4

Anda tidak memiliki pilihan karakter yang ditetapkan pada XE sehingga Anda tidak dapat mengubahnya agar sesuai dengan database yang Anda coba impor. Apakah praktis untuk memigrasi basis data sumber sebelum ekspor?

Impor harus berfungsi, tetapi konversi rangkaian karakter mungkin berarti beberapa kolom teks dengan karakter non-ascii tidak akan terlihat sama setelah impor. Dan baris dapat ditolak jika terlalu panjang di set karakter baru.

Dalam kasus Anda, Anda mengonversi ke UTF8, yang berarti karakter byte tunggal dapat tumbuh selama konversi ke 2 ( atau lebih dalam teori ). Anda mungkin perlu menambah ukuran kolom sebelum mengekspor atau menyesuaikan skema target dan mengimpor data dalam langkah terpisah. Lihat di sini untuk kemungkinan masalah pemotongan data lainnya

Jack mengatakan coba topanswers.xyz
sumber
Lihat hasil edit saya. Satu-satunya harapan saya adalah pertama-tama membuat tabel dengan lebar yang diperluas dan daripada mengimpor data mengabaikan tabel buat dari impor.
bernd_k
Anda menggunakan impdp? lihat di sini untuk mengetahui bagaimana
Jack mengatakan coba topanswers.xyz
belum, tapi mungkin saat yang tepat untuk belajar.
bernd_k
tetapi perhatikan bahwa impdp hanya dapat digunakan dengan ekspor yang dibuat dengan expdp
Jack mengatakan coba topanswers.xyz
2

Cara termudah: (Shutdown neccesary) :

Pertama, Hubungkan sebagai sysdba:

sqplus / as sysdba

Selanjutnya, jalankan skrip berikut:

alter system set nls_length_semantics=CHAR scope=both;
shutdown;
startup restrict;
alter database character set INTERNAL_USE WE8ISO8859P1;
shutdown;
startup;

Ini berhasil bagi saya dalam Oracle 12c Standard Two Edition

Diambil dari: http://www.blogdelpibe.com/2015/05/como-solucionar-el-error-ora-12899.html

Walter Colchado
sumber
0

Ini berhasil untuk saya. Alih-alih ini:

imp u/p@db file=data.dmp

Coba sesuatu seperti ini di bash:

imp u/p@db file=<(perl -pe'/^CREATE TABLE/&&s/(VARCHAR2\(\d+)\)/$1 CHAR)/g' data.dmp)

Ini berubah setiap col1 VARCHAR2(n)ke col1 VARCHAR2(n CHAR)dalam baris yang dimulai dengan CREATE TABLE. Anda juga dapat mengubah data.dmpsebelum menjalankan imp di atasnya, jika Anda tidak dapat melakukannya <(...)di shell Anda misalnya:

perl -i.bk -pe'/^CREATE TABLE/&&s/(VARCHAR2\(\d+)\)/$1 CHAR)/g' data.dmp

... tapi itu tidak perlu di bash dan ada yang tidak beres dalam konversi atau dalam membuat cadangan seperti yang dinyatakan oleh -i.bk.

Kjetil S.
sumber