it-swarm.asia

مشكلة استيراد أوراكل بسبب مجموعات الأحرف المختلفة

أحاول استيراد تصدير 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ö

بعض الصفوف مفقودة من الاستيراد.

11
bernd_k

إذا كان هذا هو DDL الفعلي الذي تستخدمه لإنشاء الجدول ، فيمكنك استخدام المعلمة NLS_LENGTH_SEMANTICS . إذا قمت بتعيين ذلك إلى CHAR بدلاً من الافتراضي لـ BYTE ، فسيتم تخصيص VARCHAR2 (5) مساحة كافية لتخزين 5 أحرف في مجموعة أحرف قاعدة البيانات (ربما تصل إلى 20 بايت) بدلاً من 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
);
8
Justin Cave

أنت لم يكن لديك اختيار مجموعة الأحرف على XE لذا لا يمكنك تغييره ليناسب قاعدة البيانات التي تحاول استيرادها. هل سيكون من العملي ترحيل قاعدة البيانات المصدر قبل التصدير؟

يجب أن يعمل الاستيراد ، لكن تحويل مجموعة الأحرف قد يعني أن بعض الأعمدة النصية ذات الأحرف غير ascii لن تبدو متشابهة بعد الاستيراد. ويمكن رفض الصفوف إذا كانت طويلة جدًا في مجموعة الأحرف الجديدة.

في حالتك ، أنت تقوم بالتحويل إلى UTF8 ، مما يعني أنه من الممكن أن ينمو حرف بايت واحد أثناء التحويل إلى 2 ( أو أكثر نظريًا ). قد تحتاج إلى زيادة حجم العمود قبل التصدير أو ضبط المخطط الهدف واستيراد البيانات في خطوة منفصلة. راجع هنا للتعرف على مشكلات اقتطاع البيانات المحتملة الأخرى

4
Jack says try topanswers.xyz

أسهل طريقة: (إيقاف الإغلاق) :

أولاً ، قم بتوصيل 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

مأخوذة من: http://www.blogdelpibe.com/2015/05/como-solucionar-el-error-ora-12899.html

2
Walter Colchado

عملت هذا بالنسبة لي. بدلا من هذا:

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

جرب شيئًا كهذا في باش:

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

يتغير هذا كل col1 VARCHAR2(n) إلى col1 VARCHAR2(n CHAR) في خطوط تبدأ بـ CREATE TABLE. يمكنك أيضًا تغيير data.dmp قبل تشغيل Imp عليه ، إذا لم تتمكن من <(...) في Shell الخاص بك على سبيل المثال:

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

... لكنه ليس ضروريًا في باش وقد يحدث خطأ في التحويل أو في إجراء النسخ الاحتياطي كما هو مذكور في -i.bk.

0
Kjetil S.