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ö

导入中缺少某些行。

Answers:


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
);

我有创建表脚本,可以根据您的建议对其进行修改。如果在创建表后imp起作用,则一切都很好。
bernd_k 2011年

@bernd_k-酷。然后,可以在运行DDL之前设置NLS_LENGTH_SEMANTICS,也可以修改DDL以将CHAR添加到每个VARCHAR2列声明中。导入时,只需告诉它忽略CREATE TABLE语句的失败,因为这些表已经存在。
贾斯汀·凯夫

我更改了表定义... VARCHAR2(60 CHAR)NOT NULL ...,并将IMP与IGNORE = Y一起使用,并且导入成功并警告终止。
bernd_k 2011年

4

无法在XE上选择字符集,因此无法更改它以适合您要导入的数据库。在导出之前迁移源数据库是否可行?

导入应该可以,但是字符集转换可能意味着某些带有非ASCII字符的文本列在导入后看起来将不一样。如果新字符集中的行太长,则可以拒绝这些行。

在您的情况下,您要转换为UTF8,这意味着在转换为2(理论上甚至更多)的过程中,单字节字符可能会增长。您可能需要在导出之前调整列大小,或者调整目标架构并在单独的步骤中导入数据。有关其他可能的数据截断问题,请参见此处


看到我的编辑。我唯一的希望是首先创建具有扩展宽度的表,然后导入数据,而忽略导入中的创建表。
bernd_k 2011年

您在使用impdp吗?看到这里如何做
杰克说尝试topanswers.xyz 2011年

尚未,但也许是学习的好时机。
bernd_k 2011年

但是请注意,impdp只能与用expdp创建的导出一起使用
杰克说,请尝试topanswers.xyz 2011年


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,如果您无法<(...)在shell中运行,也可以在运行imp之前进行更改:

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

...但是在bash中不是必需的,如所述,在转换或进行备份时可能会出错-i.bk

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.