问题:Database character set (AL32UTF8) and Client character set (ZHS16GBK) are different. Character set conversion may cause unexpected results.
解决:服务器端与客户端字符集不一致 ,通过修改注册表或者环境做修改
--查看149 ,242 服务器端命令 NLS_LENGTH_SEMANTICS 为BYTE,在升级时可以考虑在安装时就设置为CHAR
select * from nls_database_parameters
select *
from nls_database_parameters
where parameter = 'NLS_LANGUAGE'
or parameter = 'NLS_TERRITORY'
or parameter = 'NLS_CHARACTERSET'
or parameter = 'NLS_NCHAR_CHARACTERSET'
or parameter = 'NLS_LENGTH_SEMANTICS';
PARAMETER VALUE
NLS_LANGUAGE AMERICAN --
NLS_TERRITORY AMERICA
NLS_CHARACTERSET AL32UTF8 --字符集
NLS_NCHAR_CHARACTERSET UTF8 -- 国家字符集
NLS_LENGTH_SEMANTICS BYTE
--查看session环境
select userenv('language') from dual
USERENV('LANGUAGE')
SIMPLIFIED CHINESE_CHINA.AL32UTF8
--查看实例
select * from nls_instance_parameters where parameter in ( 'NLS_LANGUAGE', 'NLS_TERRITORY', 'NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET' ,'NLS_LENGTH_SEMANTICS')
PARAMETER VALUE
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_LENGTH_SEMANTICS CHAR
select userenv('language') from dual
USERENV('LANGUAGE')
AMERICAN_AMERICA.AL32UTF8
SQL> select sysdate from dual;
SYSDATE
---------------
26-JUN-08
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
--------------------------------------------------------------------------------
AMERICAN_AMERICA.AL32UTF8
SQL> alter session set NLS_LANGUAGE='SIMPLIFIED CHINESE';
会话已更改。
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.AL32UTF8
SQL> select sysdate from dual;
SYSDATE
------------
26-6月 -08
- - - - select userenv('language') from dual的language属于session环境 end- - - - - -
今天接了封邮件,项目经理要俺做个数据迁移,将开发环境中的某个表迁移到测试环境。很简单的需求。
常用的迁移有 EXP,IMP,DATAPUMP,DBLINK等等。由于无法登陆数据库主机操作系统,所以无法用DATAPUMP。
另外也没有创建DBLINK权限,而且数据库中也没有创建好了的DBLINK,这也否定了,我只能用EXP,IMP这种最原始的方法。
下面说说导入导出应该注意的事项
一:首先应该查询数据库的字符集
SQL> select * from nls_database_parameters where parameter='NLS_LANGUAGE' or parameter='NLS_TERRITORY' or parameter='NLS_CHARACTERSET';
PARAMETER VALUE
------------------------------ --------------------------------------------------------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CHARACTERSET AL32UTF8
我们知道NLS_LANG = language_territory.charset
Language指的是服务器消息语言,territory指的是服务器日期和数字,货币格式,charset指字符集。
知道了NLS_LANG的组成原理之后,就明白了,只要设置NLS_LANG中的charset一样,那么就不会产生导入导出的乱码问题
NLS_LANG中的language用来显示log中记录的语言
然后查看客户端字符集
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
--------------------------------------------------------------------------------
SIMPLIFIED CHINESE_CHINA.AL32UTF8
可以看到客户端字符集为AL32UTF8,所以导入导出是不会引起乱码的,不过由于客户端的language设置为SIMPLIFIED CHINESE,那么导入导出的log就会用中文的形式记录,如果和老外一起工作那么就设置AMERICAN_AMERICA.AL32UTF8,这样老外就能看懂log了
二:设置客户的字符集
如果是windows 直接在cmd中 set nls_lang=AMERICAN_AMERICA.AL32UTF8
如果是linux 要在shell中 export NLS_LANG=AMERICAN_AMERICA.AL32UTF8