【问题标题】:Import dmp file created in Oracle 11g (WE8ISO8859P1) to Oracle 11g XE database (AL32UTF8)将在 Oracle 11g (WE8ISO8859P1) 中创建的 dmp 文件导入到 Oracle 11g XE 数据库 (AL32UTF8)
【发布时间】:2015-08-22 19:26:42
【问题描述】:

我经常收到一个使用 oracle v.11g(使用 exp 实用程序)创建的 dmp 文件。

我曾经将此文件导入到西欧版的 Oracle 10g XE。 导入将成功终止而没有警告,但有一个错误日志 (alert_xe.log) 会不断增加大小,因为我在 64 位 Windows 操作系统上使用 32 位 Oracle 数据库。

我现在已经安装了 11g XE,我正在尝试导入相同的 dmp 文件,但我在导入日志文件中看到以下内容:

import done in WE8MSWIN1252 character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
export client uses WE8ISO8859P1 character set (possible charset conversion)

由于我有很多以下错误,因此导入终止并发出警告:

IMP-00019: row rejected due to ORACLE error 12899
IMP-00003: ORACLE error 12899 encountered
ORA-12899: value too large for column XXX (actual: 256, maximum: 255)

我了解问题的原因是源数据库使用字节语义,而我的新 11g XE 数据库使用多字节字符集。

我无法控制源数据库,因此我无法更改那里的任何内容。

此外,我无法使用字符长度语义而不是字节语义(如此处所示,例如Character set in Oracle 11g r2 XE)预先创建具有列定义的表,因为有时源数据库架构会发生更改(可能会添加列)并且我没有收到通知这样会破坏导入。

这个问题有解决办法吗? 有什么方法可以将 WE8MSWIN1252 与 Oracle 11g XE 一起使用?

【问题讨论】:

  • 我设法按照这篇文章中的步骤更改了字符集:stackoverflow.com/questions/23779159/…。有人在执行此操作时遇到问题吗? (我每次都导入一个空数据库,所以我没有现有的数据库可以搞砸)
  • 尝试设置 NLS_LANG 环境变量以匹配源数据库。
  • @TenG,设置 NLS_LANG 没用,因为转储文件包含 WE8ISO8859P1 编码 DDL 并且还将 NLS_LENGTH_SEMANTICS 从 BYTE 设置为 CHAR 也没用。

标签: oracle oracle11g oracle-apex oracle-xe


【解决方案1】:

不,很遗憾你做不到。

正如 Oracle 官方文档中所述:

9 Oracle Database XE Character and Language Configurations

Oracle Database XE is available only in Universal character set and language configurations:

The database is created using Unicode(AL32UTF8) character set, which is suitable for global data in any language.

http://docs.oracle.com/cd/E17781_01/install.112/e18803/toc.htm#XEINW138

唯一的解决方法是提前预先分配表。

【讨论】:

  • 我设法更改了原始问题评论中所述的字符集,并且导入工作正常。我知道这不是官方支持的,但我不需要对这个 Oracle 数据库做太多事情。我每次都删除所有表并导入新的 dmp 文件。
【解决方案2】:

我遇到了同样的问题。 当我运行这个命令时

imp <username>/<password>@<hostname> file=<filename>.dmp log=<filename>.log 

它正在显示

import done in AL32UTF8 character set and AL16UTF16 NCHAR character set
export client uses AR8MSWIN1256 character set (possible charset conversion)
IMP-00031: Must specify FULL=Y or provide FROMUSER/TOUSER or TABLES arguments
IMP-00000: Import terminated unsuccessfully

也就是说我的oracle服务器是AL32UTF8字符集,导出转储文件客户端使用AR8MSWIN1256字符集。

所以我只是使用以下命令将 oracle 字符集更改为 AR8MSWIN1256

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET INTERNAL_USE AR8ISO8859P6;
SHUTDOWN IMMEDIATE;
STARTUP;

然后再次运行

imp <username>/<password>@<hostname> file=<filename>.dmp log=<filename>.log  FULL=Y 

我希望这个anwser会帮助别人

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 2014-04-29
    • 2016-04-26
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2018-07-07
    • 1970-01-01
    相关资源
    最近更新 更多