ปัญหาการนำเข้าของ 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 อักขระในชุดอักขระฐานข้อมูล )

น่าเสียดายที่การเปลี่ยนแปลง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 เนื่องจากตารางจะมีอยู่แล้ว
Justin Cave

ฉันเปลี่ยนคำจำกัดความของตารางของฉัน ... VARCHAR2 (60 CHAR) ไม่ใช่ NULL ... และใช้ IMP กับ IGNORE = Y และนำเข้าสิ้นสุดลงด้วยคำเตือน
bernd_k

4

คุณไม่มีตัวเลือกชุดอักขระบน XEดังนั้นคุณจึงไม่สามารถเปลี่ยนให้เหมาะกับฐานข้อมูลที่คุณกำลังพยายามนำเข้า จะเป็นประโยชน์หรือไม่ที่จะย้ายฐานข้อมูลต้นทางก่อนส่งออก

การนำเข้าควรใช้งานได้ แต่การแปลงชุดอักขระอาจหมายถึงบางคอลัมน์ข้อความที่มีอักขระที่ไม่ใช่ ASCII จะไม่เหมือนกันหลังจากการนำเข้า และแถวสามารถถูกปฏิเสธได้หากยาวเกินไปในชุดอักขระใหม่

ในกรณีของคุณคุณกำลังแปลงเป็น UTF8 ซึ่งจะหมายความว่าเป็นไปได้ที่อักขระไบต์เดียวจะเติบโตระหว่างการแปลงเป็น 2 ( หรือมากกว่าในทางทฤษฎี ) คุณอาจต้องเพิ่มขนาดคอลัมน์ก่อนส่งออกหรือปรับสคีเป้าหมายและนำเข้าข้อมูลในขั้นตอนแยกต่างหาก ดูที่นี่สำหรับปัญหาการตัดข้อมูลที่เป็นไปได้อื่น ๆ


ดูการแก้ไขของฉัน ความหวังเดียวของฉันคือการสร้างตารางที่มีความกว้างเพิ่มขึ้นและนำเข้าข้อมูลโดยไม่สนใจตารางสร้างจากการนำเข้า
bernd_k

คุณใช้ impdp หรือไม่ ดูที่นี่สำหรับวิธี
แจ็คพูดว่าลอง topanswers.xyz

ยังไม่ได้ แต่อาจเป็นเวลาที่ดีในการเรียนรู้
bernd_k

แต่โปรดทราบว่า impdp สามารถใช้ได้กับการส่งออกที่สร้างขึ้นด้วย expdp เท่านั้น
Jack บอกว่าลอง 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

ลองทำอะไรแบบนี้ใน bash:

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

... -i.bkแต่มันไม่จำเป็นในการทุบตีและบางสิ่งบางอย่างอาจผิดไปในแปลงหรือในการทำสำรองข้อมูลตามที่ระบุไว้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.