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;
查看数据库中文显示正常。