Vấn đề nhập khẩu Oracle gây ra bởi các bộ ký tự khác nhau


11

Tôi đang cố gắng nhập một bản xuất Oracle 11 vào Oracle 11 XE.

Tôi nhận được các tin nhắn sau:

nhập vào XE fehlerhaft nhập được thực hiện trong bộ ký tự WE8MSWIN1252 và
máy chủ nhập bộ ký tự AL16UTF16 NCHAR sử dụng bộ ký tự AL32UTF8 (có thể chuyển đổi bộ ký tự)

Bất cứ ý tưởng nào, làm thế nào tôi có thể nhập bãi chứa này vào Oracle 11 XE?

Biên tập:

Đưa ra một bảng

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

Tôi gặp lỗi như thế này

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ö

Một số hàng bị thiếu trong quá trình nhập.

Câu trả lời:


8

Nếu đó là DDL thực tế bạn đang sử dụng để tạo bảng, bạn có thể sử dụng tham số NLS_LENGTH_SEMANTICS . Nếu bạn đặt thành CHAR thay vì mặc định của BYTE, VARCHAR2 (5) sẽ được phân bổ đủ dung lượng để lưu trữ 5 ký tự trong bộ ký tự cơ sở dữ liệu (có khả năng tối đa 20 byte) thay vì 5 byte (chỉ có thể cho phép 1 ký tự ).

Thật không may, việc thay đổi NLS_LENGTH_SEMANTICScó lẽ sẽ không hữu ích lắm nếu bạn dựa vào quá trình nhập để tạo bảng-- tệp kết xuất sẽ thêm từ khóa CHAR hoặc BYTE để nó thực sự phát hành câu lệnh

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

Tôi có kịch bản tạo bảng và có thể sửa đổi nó theo đề xuất của bạn. Nếu imp hoạt động khi các bảng đã được tạo, tất cả sẽ ổn.
bernd_k

@bernd_k - Tuyệt. Sau đó, bạn có thể đặt NLS_LENGTH_SEMANTICS trước khi chạy DDL hoặc bạn có thể sửa đổi DDL để thêm CHAR vào mỗi khai báo cột VARCHAR2. Khi bạn thực hiện nhập, bạn sẽ phải thông báo cho nó để bỏ qua sự thất bại của các câu lệnh CREATE TABLE vì các bảng sẽ tồn tại.
Hang Justin

Tôi đã thay đổi định nghĩa bảng của mình ... VARCHAR2 (60 CHAR) KHÔNG NULL ... và đã sử dụng IMP với IGNORE = Y và Nhập kết thúc thành công với các cảnh báo.
bernd_k

4

Bạn không có lựa chọn bộ ký tự trên XE để bạn không thể thay đổi nó cho phù hợp với cơ sở dữ liệu bạn đang cố gắng nhập. Nó sẽ là thực tế để di chuyển cơ sở dữ liệu nguồn trước khi xuất khẩu?

Quá trình nhập sẽ hoạt động, nhưng chuyển đổi bộ ký tự có thể có nghĩa là một số cột văn bản có các ký tự không phải mã ascii sẽ không giống nhau sau khi nhập. Và các hàng có thể bị từ chối nếu chúng quá dài trong bộ ký tự mới.

Trong trường hợp của bạn, bạn đang chuyển đổi sang UTF8, điều đó có nghĩa là một ký tự byte đơn có thể phát triển trong quá trình chuyển đổi thành 2 ( hoặc nhiều hơn về lý thuyết ). Bạn có thể cần tăng kích thước cột trước khi xuất hoặc điều chỉnh lược đồ đích và nhập dữ liệu theo một bước riêng. Xem ở đây để biết các vấn đề cắt dữ liệu có thể khác


Xem chỉnh sửa của tôi. Hy vọng duy nhất của tôi là trước tiên tạo các bảng có chiều rộng mở rộng và hơn là nhập dữ liệu bỏ qua các bảng tạo từ nhập.
bernd_k

bạn đang sử dụng impdp? xem ở đây để biết cách
Jack nói hãy thử topanswers.xyz

chưa, nhưng có lẽ là thời gian tốt để tìm hiểu.
bernd_k

nhưng lưu ý rằng impdp chỉ có thể được sử dụng với xuất khẩu được tạo bằng expdp
Jack nói hãy thử topanswers.xyz

2

Cách dễ nhất: (Tắt máy cần thiết) :

Đầu tiên, kết nối như sysdba:

sqplus / as sysdba

Tiếp theo, thực thi đoạn script sau:

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

Nó hoạt động với tôi trong phiên bản Oracle 12c Standard Two

Lấy từ: http://www.blogdelpibe.com/2015/05/como-solucionar-el-error-ora-12899.html


0

Điều này làm việc cho tôi. Thay vì điều này:

imp u/p@db file=data.dmp

Hãy thử một cái gì đó như thế này trong bash:

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

Điều này thay đổi mỗi col1 VARCHAR2(n)đến col1 VARCHAR2(n CHAR)trong dòng bắt đầu bằng CREATE TABLE. Bạn cũng có thể thay đổi data.dmptrước khi chạy imp trên nó, nếu bạn không thể <(...)vào vỏ của mình chẳng hạn:

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

... nhưng không cần thiết trong bash và có thể có lỗi trong quá trình chuyển đổi hoặc tạo bản sao lưu như đã nêu -i.bk.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.