Проблема імпорту Oracle, викликана різними наборами символів


11

Я намагаюся імпортувати експорт Oracle 11 в Oracle 11 XE.

Я отримую такі повідомлення:

імпорт в XE fehlerhaft імпорт виконаний у наборі символів WE8MSWIN1252 і сервер імпорту набору символів AL16UTF16 NCHAR
використовує набір символів AL32UTF8 (можливе перетворення діаграм)

Будь-які ідеї, як я можу імпортувати цей дамп в Oracle 11 XE?

Редагувати:

Дано таблицю

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

Я отримую подібні помилки

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ö

Деякі рядки відсутні в імпорті.

Відповіді:


8

Якщо це фактичний DDL, який ви використовуєте для створення таблиці, ви можете використовувати параметр NLS_LENGTH_SEMANTICS . Якщо встановити це як CHAR, а не за замовчуванням BYTE, VARCHAR2 (5) буде виділено достатньо місця для зберігання 5 символів у наборі символів бази даних (потенційно до 20 байт), а не 5 байт (що може дозволити лише 1 символ ).

На жаль, зміни, NLS_LENGTH_SEMANTICSймовірно, не будуть дуже корисними, якщо ви покладаєтесь на процес імпорту, щоб створити таблицю - файл дампа по суті додасть ключове слово CHAR або BYTE, щоб воно фактично видало заяву

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

У мене є сценарій створення таблиці та можу змінити його відповідно до вашої пропозиції. Якщо імпульс працює, коли таблиці вже створені, все було б добре.
bernd_k

@bernd_k - Класно. Тоді ви можете встановити NLS_LENGTH_SEMANTICS перед запуском DDL або ви можете змінити DDL, щоб додати CHAR до кожної декларації стовпців VARCHAR2. Виконуючи імпорт, вам просто доведеться сказати йому, щоб ігнорувати помилку операторів CREATE TABLE, оскільки таблиці вже існуватимуть.
Джастін Печера

Я змінив своє визначення таблиці ... VARCHAR2 (60 CHAR) NOT NULL ... і застосував IMP з IGNORE = Y, а імпорт успішно припинено з попередженнями.
bernd_k

4

У вас немає вибору набору символів на XE, тому ви не можете змінити його відповідно до бази даних, яку ви намагаєтеся імпортувати. Чи було б практично перенести вихідну базу даних перед експортом?

Імпорт повинен працювати, але перетворення набору символів може означати, що деякі текстові стовпці з символами, які не належать до аscii, не будуть виглядати однаково після імпорту. І рядки можна відхилити, якщо вони занадто довгі в новому наборі символів.

У вашому випадку ви перетворюєтесь на UTF8, що означає, що під час перетворення на 2 ( або теоретично більше ) один байтовий символ може зростати . Можливо, вам потрібно буде збільшити розмір стовпця перед експортом або відрегулювати цільову схему та імпортувати дані окремим кроком. Дивіться тут для інших можливих проблем усічення даних


Дивіться мою редакцію. Моя єдина надія - спершу створити таблиці з розширеною шириною, а потім імпортувати дані, ігноруючи створені таблиці з імпорту.
bernd_k

Ви використовуєте impdp? дивіться тут, як
Джек каже спробувати topanswers.xyz

ще немає, але, можливо, вдалий час для навчання.
bernd_k

але зауважте, що impdp можна використовувати лише для експорту, створеного за допомогою expdp
Джек каже спробувати topanswers.xyz

2

Найпростіший спосіб: (Вимкнення необхідності) :

Спочатку підключіться як sysdba:

sqplus / as sysdba

Далі виконайте такий сценарій:

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

Він працював для мене у Oracle 12c Standard Two Edition

Взято з: http://www.blogdelpibe.com/2015/05/como-solucionar-el-error-ora-12899.html


0

Це працювало для мене. Замість цього:

imp u/p@db file=data.dmp

Спробуйте щось подібне в баші:

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

Це змінюється кожен , col1 VARCHAR2(n)щоб col1 VARCHAR2(n CHAR)в рядках , починаючи з CREATE TABLE. Ви також можете змінити, data.dmpперш ніж запустити імп, якщо ви не можете <(...)в своїй оболонці:

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

... але це не потрібно в bash, і щось може піти не так у конвертації або в створенні резервної копії, як зазначено в -i.bk.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.