0

我在笔记本电脑上安装了 oracle 10gr2 express edition。当我导入由 oracle 10gr2 企业版生成的 .dmp 文件时,出现错误。

生成 .dmp 文件的数据库服务器使用 GBK字符集运行,但我的 oracle express 服务器使用UTF-8运行。

SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
--------------------------------------------------------------------------------
SIMPLIFIED CHINESE_CHINA.AL32UTF8

如何配置我自己的 oracle 服务器来导入 .dmp 文件?

编辑 - - - - - - - - - - - - - - - - - - - - - - - - - -- 我自己的 oracle express 服务器:

SQL> select * from v$nls_parameters where parameter like '%CHARACTERSET';

PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_CHARACTERSET
AL32UTF8

NLS_NCHAR_CHARACTERSET
AL16UTF16
4

2 回答 2

5

新字符集每个字符最多需要 4 个字节,而旧字符集最多只需要 2 个字节。所以由于字符集的变化,一些字符字段会比以前需要更多的空间。显然,其中一些现在已经达到了列长度限制。

要解决它,您必须增加受影响列的长度或更改长度语义,以便以字符(而不是字节,这是默认值)解释长度。

如果您的转储文件同时包含架构定义和数据,则您必须分阶段工作:首先仅导入架构,增加列长度,最后导入数据。

我对长度语义没有经验。我通常会明确指定它。有关信息,请参阅有关 NLS_LENGTH_SEMANTICS 参数的文档。它影响如何100解释以下语句中的数字:

CREATE TABLE example (
    id NUMBER,
    name VARCHAR(100)
);

通常,最好是明确的并直接指定单位:

CREATE TABLE example (
    id NUMBER,
    name VARCHAR(100 CHAR)
);
于 2012-02-27T10:54:46.800 回答
3

转储文件包含整个架构,更改列长度对我来说不是一个好选择。

Oracle Express 版本默认使用 UTF-8,在网上搜索后,我找到了一种更改数据库字符集的方法。

在我的例子中: UTF-8 --> GBK

我在 sqlplus 中以 sysdba 的身份与用户 sys 连接。然后执行以下命令:

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

shutdown immediate  

startup

我不知道这些命令对我的数据库做了什么,但它有效。

于 2012-02-28T01:32:10.857 回答