it-swarm-eu.dev

Problém s importem Oracle způsobený různými sadami znaků

Snažím se importovat export Oracle 11 do Oracle 11 XE.

Zobrazuji následující zprávy:

import v XE fehlerhaftu import proveden v WE8MSWIN1252 znakové sadě a AL16UTF16 NCHAR znakové sadě
importní server používá znakovou sadu AL32UTF8 (možná převod znakové sady)

Nějaké nápady, jak mohu importovat tento výpis do Oracle 11 XE?

pravit:

Daný stůl

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

Mám takové chyby

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ö

Některé řádky v importu chybí.

11
bernd_k

Pokud je to skutečný DDL, který používáte k vytvoření tabulky, můžete použít parametr NLS_LENGTH_SEMANTICS . Pokud to nastavíte na hodnotu CHAR, nikoli na výchozí hodnotu BYTE, bude VARCHAR2 (5) přiděleno dost místa pro uložení 5 znaků v sadě znakových databází (potenciálně až 20 bajtů) namísto 5 bajtů (což by mohlo umožnit pouze 1 znak) ).

Bohužel, změna NLS_LENGTH_SEMANTICS pravděpodobně nebude moc užitečné, pokud se při vytváření tabulky spoléháte na proces importu - soubor výpisu neodmyslitelně přidá klíčové slovo CHAR nebo BYTE, takže by skutečně vydal příkaz

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

Vy nemáte na XE na výběr znakovou sad , takže ji nemůžete změnit tak, aby vyhovovala databázi, kterou se pokoušíte importovat. Bylo by praktické před exportem migrovat zdrojovou databázi?

Import by měl fungovat, ale převod znakové sady může znamenat, že některé textové sloupce se znaky mimo ASCII nebudou po importu vypadat stejně. Řádky lze odmítnout, pokud jsou v nové znakové sadě příliš dlouhé.

Ve vašem případě převádíte na UTF8, což znamená, že během převodu na 2 ( nebo více teoreticky ) bude růst jednoho bajtového znaku. Možná budete muset zvětšit velikost sloupce před exportem nebo upravit cílové schéma a importovat data v samostatném kroku. Viz zde pro další možné problémy se zkrácením dat

Nejjednodušší způsob: (je nutné vypnout) :

Nejprve se připojte jako sysdba:

sqplus / as sysdba

Dále spusťte následující skript:

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

Fungovalo to pro mě ve verzi Oracle 12c Standard Two Edition

Převzato z: http://www.blogdelpibe.com/2015/05/como-solucionar-el-error-ora-12899.html

2
Walter Colchado

Fungovalo to pro mě. Místo toho:

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

Zkuste něco takového v bash:

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

To mění každou col1 VARCHAR2(n) na col1 VARCHAR2(n CHAR) v řádcích začínajících CREATE TABLE. Můžete také změnit data.dmp Před spuštěním imp, pokud nejste schopni <(...) ve vašem Shell například:

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

... ale v bash to není nutné a něco se může při převodu nebo při vytváření zálohy pokazit, jak je uvedeno v -i.bk.

0
Kjetil S.