Oracle 字符集问题& NLS_LENGTH_SEMANTICS& 理解ORACLE数据库字符集

 
-----------  字符集的问题    begin  -------------
问题:Database character set (AL32UTF8) and Client character set (ZHS16GBK) are different. Character set conversion may cause unexpected results. 
Note: you can set the client character set through the NLS_LANG environment variable or the NLS_LANG registry key in HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\KEY_OraClient11g_home1.
解决:服务器端与客户端字符集不一致  ,通过修改注册表或者环境做修改
 
步骤1

  --查看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

步骤2


--查看session环境

 select userenv('language') from dual 

 
 USERENV('LANGUAGE')
SIMPLIFIED CHINESE_CHINA.AL32UTF8

 

步骤3

 

 --查看实例
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

 


 

步骤4
确定不一致,修改 环境变量
NLS_LANG=AMERICAN_AMERICA.AL32UTF8     
这样字符问题解决,再次

 select userenv('language') from dual 

USERENV('LANGUAGE')
AMERICAN_AMERICA.AL32UTF8

 
(参考下面文档   AMERICAN_AMERICA.AL32UTF8   还是   SIMPLIFIED CHINESE_CHINA.AL32UTF8  )

 
 
 - - - - select userenv('language') from dual的language属于session环境 begin  - - - - -  -
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- - - - -  -
 
 
---   AMERICAN_AMERICA.AL32UTF8   还是   SIMPLIFIED CHINESE_CHINA.AL32UTF8   begin ---- - - - - - - -
 

今天接了封邮件,项目经理要俺做个数据迁移,将开发环境中的某个表迁移到测试环境。很简单的需求。

常用的迁移有 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


 
---   <
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值