it-swarm.asia

Masalah Impor Oracle disebabkan oleh rangkaian karakter yang berbeda

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 set karakter AL16UTF16 NCHAR
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.

11
bernd_k

Jika itu adalah DDL aktual yang Anda gunakan untuk membuat tabel, Anda bisa menggunakan NLS_LENGTH_SEMANTICS parameter. 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_SEMANTICS mungkin tidak akan terlalu membantu jika Anda mengandalkan proses impor untuk membuat tabel - file dump 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
);
8
Justin Cave

Anda tidak memiliki pilihan set karakter pada XE sehingga Anda tidak dapat mengubahnya agar sesuai dengan database yang Anda coba impor. Apakah praktis untuk bermigrasi 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

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

2
Walter Colchado

Ini berhasil untuk saya. Alih-alih ini:

imp u/[email protected] file=data.dmp

Coba sesuatu seperti ini di bash:

imp u/[email protected] file=<(Perl -pe'/^CREATE TABLE/&&s/(VARCHAR2\(\d+)\)/$1 CHAR)/g' data.dmp)

Ini mengubah setiap col1 VARCHAR2(n) menjadi col1 VARCHAR2(n CHAR) dalam baris yang dimulai dengan CREATE TABLE. Anda juga dapat mengubah data.dmp Sebelum menjalankan imp di atasnya, jika Anda tidak dapat <(...) 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 salah dalam konversi atau dalam membuat cadangan seperti yang dinyatakan oleh -i.bk.

0
Kjetil S.