关于数据库字符集

影响 Oracle 数据库字符集最重要的参数是NLS_LANG参数
它的格式如下: NLS_LANG = language_territory.charset
它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。

其中:

Language: 指定服务器消息的语言, 影响提示信息是中文还是英文

Territory: 指定服务器的日期和数字格式,

Charset:  指定字符集。

如:AMERICAN _ AMERICA. ZHS16GBK

从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。
所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。


怎么查看数据库版本

select * from v$version

包含版本信息,核心版本信息,位数信息(32位或64位)等  
至于位数信息,在Linux/unix平台上,可以通过file查看,如file $ORACLE_HOME/bin/oracle

二、查看数据库字符集

数据库服务器字符集

select * from nls_database_parameters;

客户端字符集环境

select * from nls_instance_parameters;

表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表

会话字符集环境

select * from nls_session_parameters;

客户端的字符集要求与服务器一致或者是服务器的超集,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件

字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。

查询oracle server端的字符集

select userenv('language') from dual;

如何查询dmp文件的字符集

一般dmp日志信息中会有记录

查询oracle client端的字符集

在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置,

比如: set nls_lang=AMERICAN_AMERICA.ZHS16GBK

这样就只影响这个窗口里面的环境变量。

在unix平台下,就是环境变量NLS_LANG。

$echo $NLS_LANG

AMERICAN_AMERICA.ZHS16GBK

如果检查的结果发现数据库server端与client端字符集不一致,请统一修改为同数据库server端相同的字符集。

NLS_LANG参数格式

    NLS_LANG=<language>_<territory>.<client character set>

    Language: 显示oracle消息,校验,日期命名

    Territory:指定默认日期、数字、货币等格式

    Client character set:指定客户端将使用的字符集

    例如:NLS_LANG=AMERICAN_AMERICA.US7ASCII

    AMERICAN是语言,AMERICA是地区,US7ASCII是客户端字符集

EXP/IMP 与 字符集

由于使用exp/imp进行数据迁移时,数据从源数据库到目标数据库的过程中有四个环节涉及到字符集,如果这四个环节的字符集不一致,将会发生字符集转换。

EXP

     ____________ _________________ _____________

     |imp导入文件|<-|环境变量NLS_LANG|<-|数据库字符集|

      ------------   -----------------   -------------

IMP

     ____________ _________________ _____________

     |imp导入文件|->|环境变量NLS_LANG|->|数据库字符集|

      ------------   -----------------   -------------

 

 

四个字符集是

   (1)源数据库字符集

   (2)Export过程中用户会话字符集(通过NLS_LANG设定)

   (3)Import过程中用户会话字符集(通过NLS_LANG设定)

   (4)目标数据库字符集

    
导出的转换过程

例:如果源数据库使用ZHS16GBK,而Export用户会话字符集使用US7ASCII,由于ZHS16GBK是16位字符集,而US7ASCII是7位字符集,这个转换过程中,中文字符在US7ASCII中不能够找到对等的字符,所以所有中文字符都会丢失而变成“?? ”形式,这样转换后生成的Dmp文件已经发生了数据丢失。

因此如果想正确导出源数据库数据,则Export过程中用户会话字符集应等于源数据库字符集或是源数据库字符集的超集

导入的转换过程

第一次:导入文件字符集与导入Session使用的字符集之间的转换,如果这个转换过程不能正确完成,Import向目标数据库的导入过程也就不能完成。

第二次:导入Session字符集与数据库字符集之间的转换。





来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29802484/viewspace-2047597/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29802484/viewspace-2047597/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值