Oracle11g 数据库导入导出之中文乱码问题的解决

时间:2020-12-05 07:53:51

Oracle11g 数据库导入导出之中文乱码问题的解决

--------统一字符集

当我们需要将数据库A中的数据导入到数据库B中时,若数据中存在中文,经常会出现中文乱码的现象,我们可以通过以下步骤解决:

. 查询字符集编码:

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

或者 select * from V$NLS_PARAMETERS;

或者select * from nls_database_parameters where parameter like 'NLS%CHARACTERSET';

 

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

环境变量nls_lang便是由这三部分组成:

1.NLS_LANGUAGE

2.NLS_TERRITORY

3.NLS_CHARACTERSET

组成如下:NLS_LANG= language_territory.charset

即语言、地域和字符集,每个成分控制了 NLS 子集的特性。其中:
Language: 指定服务器消息的语言, 影响提示信息是中文还是英文
Territory: 指定服务器的日期和数字格式

Charset指定字符集。

真正影响数据库的是第三部分,因此,我们将Charset修改为常用的AL32UTF8

二. 修改Oracle服务器端的字符集

 

SQL> shutdown immediate
SQL> startup nomount
SQL> alter database mount exclusive;  --装载数据为专用的高级模式;
SQL> alter system enable restricted session; --启用受限制的session模式
SQL> alter system set job_queue_processes=0; --'maximum number of job queueslave processes' 设置工作队列的最大进程数为0
SQL> alter system set aq_tm_processes=0;
SQL> alter database open;
SQL> alter database character set AL32UTF8; --新的字符集必须支持旧的字符集(旧字符集的超集),

报错:ORA-12712: new character set must bea superset of old character set,再次执行下面的语句,修改成功

SQL> alter databasecharacter set INTERNAL_USE AL32UTF8; 

SQL> shutdown immediate

SQL> startup

 

查询:

SQL> selectuserenv('language') from dual;

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

 

可以看到已经更改成功!如果此时执行命令时出现乱码可能是因为本机的NLS_LANG参数和Oracle服务器不一致。

三. 客户端关于Oracle的字符集编码设置

 

客户端与服务器端字符集不一致时可能导致cmd或者shell显示乱码:

Windows:
# 常用中文字符集
set NLS_LANG=american_america.AL32UTF8(仅在此cmd窗口立即生效)
# 常用unicode字符集
set NLS_LANG=american_america.AL32UTF8
可以通过修改注册表键值永久设置
HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/KEY_OraDb11g_home1/NLS_LANG(任何窗口生效,但是需要重启系统生效)

#通过属性-高级系统设置-环境变量加入

NLS_LANG=american_america.AL32UTF8环境变量(此环境变量优先级高于注册表环境变量)

 

Unix:
#
常用unicode字符集
export NLS_LANG=american_america.AL32UTF8
#
常用中文字符集
export NLS_LANG="Simplified Chinese_china".ZHS16GBK
可以编辑 bash_profile文件进行永久设置
vi .bash_profile
export NLS_LANG=american_america.AL32UTF8

# 使 bash_profile设置生效
source .bash_profile

四. 导出.sql文件并修改字符集

l  导出数据库A 中的数据,导出xx.sql文件,如下所示:

l  以txt的文本或UE编辑器修改文件的编码,打开文件后点击“另存为”,选择编码方式为UTF-8,如下所示:

 

 

 

在sqlplus中运行xx.sql文件:

SQL>  @./xx.sql;

查看数据库中文显示正常。