Oracle数据库多语言文字存储解决方案(二)

一、Oracle字符集

Oracle字符集包括两部分。一部分是Server端数据库运行实例(instance)的字符集,一部分是Oracle客户端Client的字符集。

1  数据库实例的字符集(以Oracle 10g为例)

 

       

           

 

在安装Oracle数据库过程中,可以选择数据库字符集。默认的是OS系统的字符集,如简体中文系统是GB2312,繁体系统是BIG5Oracle对于简体系统的字符集使用ZHS16GBK,GBKGB2312的超集,Oracle不识别GB2312,只认ZHS16GBK。此外,选择Unicode作为数据库字符集,所有存储数据都将以Unicode编码存储在数据库中,不论字段类型是Numbervarchar2DateTime等。或者也可以从字符集列表中选择其他字符集。注意到有个国家字符集的选项,而且国家字符集的选择只有unicode,这是为当数据库字符集为非Unicode时将数据存为Unicode编码时用到。比如:数据库字符集为ZHS16GBK,数据库表mer_categ的一个字段为S_merc_name,数据类型为varchar2,存入中文字符物流物流这两个字符使用GBK字符集编码存储。通过“select dump(s_merc_name,16) from mer_categ”查询该字段在数据库中的内码得到结果是:ce,ef ,c1,f7,这与我们在前面看到的示例表中这两个字的内码是一致的。现在,把S_merc_name这个字段类型改为nvarchar2,意味着这个字段数据的存储将使用National Charset(国家字符集)——AL16UTF16的编码存储。同样写入物流两个中文字符,再次查询该数据在数据库中的内码结果是:e7,89,a9e6,b5,81,这就是我们为什么使用nvarchar2作为字段类型的原因。回过头来看,如果数据库字符集选择了Unicode,那表字段中使用nvarchar2已经没什么意义了,因为所有字段类型的数据都是使用Unicdoe编码来保存的。

查询数据库字符集的sql指令是:

“select * from v$nls_parameters”

得出结果:

NLS_LANGUAGE

SIMPLIFIED CHINESE

NLS_TERRITORY

CHINA

NLS_CURRENCY

NLS_ISO_CURRENCY

CHINA

NLS_NUMERIC_CHARACTERS

.,

NLS_CALENDAR

GREGORIAN

NLS_DATE_FORMAT

DD-MON-RR

NLS_DATE_LANGUAGE

SIMPLIFIED CHINESE

NLS_CHARACTERSET

AL32UTF8

NLS_SORT

BINARY

NLS_TIME_FORMAT

HH.MI.SSXFF AM

NLS_TIMESTAMP_FORMAT

DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT

HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT

DD-MON-RR HH.MI.SSXFF AM TZR

NLS_DUAL_CURRENCY

NLS_NCHAR_CHARACTERSET

UTF8

NLS_COMP

BINARY

NLS_LENGTH_SEMANTICS

BYTE

NLS_NCHAR_CONV_EXCP

FALSE

 

其中NLS_CHARACTERSET 是数据库的字符集;NLS_NCHAR_CHARACTERSET是国家字符集。

数据库的字符集在建立数据库的时候创建。目前也有方法转换字符集,但两个字符集的转换还是存在风险,造成数据丢失或错误,不建议使用。

 

2  Oracle Client字符集(NLS_LANG)

在访问Oracle的客户端安装Oracle Client过程中并没有选项选择Oracle Client的字符集,安装完毕后在注册表HKLOCAL_MACHINE/SOFTWARE/ORACLE/KEY_ORACLECLENT_HOME1/可以找到NLS_LANG键,值为当前OS的字符集。如简体系统为:ZHS16GBK,繁体系统为:MSWIN950。可见,Oracle Client(以下简称NLS_LANG)在安装过程中选择了OS的字符集作为默认的NLS_LANG字符集。

   设定NLS_LANG有三种方法:

a)      修改注册表。将HKLOCAL_MACHINE/SOFTWARE/ORACLE/KEY_ORACLECLENT_HOME1/NLS_LANG键值改为你要设定的字符集,如将SIMPLIFIED CHINESE_CHINA.ZHS16GBK改为:SIMPLIFIED CHINESE_CHINA.AL32UTF8。但这种做法似乎无效,即使重新启动机器后,也没有生效,NLS_LANG仍使用当初安装时的OS字符集。

b)      设定环境变量。在My Computer->Properties->Advanced->Environment Variables->System Variables 新增环境变量设置,如:Variable name=NLS_LANGVariable Value= SIMPLIFIED CHINESE_CHINA.AL32UTF8。这样NLS_LANG字符集为UTF8,这个NLS_LANG优先序高于注册表中的NLS。注意:环境变量设在系统变量中(System Vairables),而不是用户变量(User Vairables)。

c)      在应用程序运行的Process Session中设定。在程序运行之前,先通过set NLS_LANG=进程Session的字符集。例如:

  

           

 

Echo %nls_lang%,在这个session中,已经设定NLS_LANG字符集为ZHS16GBK。同样,你也可以新开一个CMD窗口,设定另一种NLS_LANG字符集。这种在session中设定NLS_LANG的优先序高于系统环境变量NLS_LANG。注册表NLS_LANG、系统环境变量NLS_LANGSession NLS_LANG的优先序是:Session NLS_LANG > 系统环境变量NLS_LANG > 注册表NLS_LANG


 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值