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.

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
);

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


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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.