数据库字符集

影响Oracle数据库字符集最重要的参数是NLS_LANG参数。

它的格式如下: NLS_LANG = language_territory.charset

它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。

其中:

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

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

Charset  指定字符集。

如:AMERICAN _ AMERICA. ZHS16GBK

从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分

所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文

Oracle提供若干NLS参数定制数据库和用户机以适应本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等,可以通过查询以下数据字典或v$视图查看。
NLS_DATABASE_PARAMETERS:显示数据库当前NLS参数取值,包括数据库字符集取值
NLS_SESSION_PARAMETERS  显示由NLS_LANG 设置的参数,或经过alter session 改变后的参数值(不包括由NLS_LANG 设置的客户端字符集)
NLS_INSTANCE_PARAMETE 显示由参数文件init<SID>.ora 定义的参数

V$NLS_PARAMETERS显示数据库当前NLS参数取值


SQL> select * from nls_database_parameters;
PARAMETER                      VALUE
------------------------------ ------------------------------
NLS_LANGUAGE                   AMERICAN   /*国家:影响错误信息的显示语言。
NLS_TERRITORY                  NEW ZEALAND /*地域:影响时间显示格式
NLS_CURRENCY                   $
NLS_ISO_CURRENCY               NEW ZEALAND
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               AL32UTF8 /*数据库字符集
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                DD/MM/RR
NLS_DATE_LANGUAGE              AMERICAN
NLS_SORT                       BINARY
NLS_TIME_FORMAT                HH24:MI:SSXFF

PARAMETER                      VALUE
------------------------------ ------------------------------
NLS_TIMESTAMP_FORMAT           DD/MM/RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT             HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT        DD/MM/RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY              $
NLS_COMP                       BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE
NLS_NCHAR_CHARACTERSET         AL16UTF16  /*国家字符集默认值
NLS_RDBMS_VERSION              11.2.0.2.0

20 rows selected.


===以下内容来自百度====
字符集,实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。Oracle的字符集命名遵循以下命名规则:<Language><bitsize><encoding>   即:  <语言><比特位数><编码> 。比如: AL32UTF8表示:AL,代表all,指使用所有语言;32,,32位;UTF8编码。查看环境变量发现:NLS_LANG=American_America.AL32UTF8,American表示语言;America表示地区;AL32UTF8字符集类型。


2.2 字符编码方案


2.2.1单字节编码    (1)单字节7位字符集,可以定义128个字符,最常用的字符集为US7ASCII    (2)单字节8位字符集,可以定义256个字符,适合于欧洲大部分国家             例如:WE8ISO8859P1(西欧、8位、ISO标准8859P1编码)

2.2.2多字节编码    (1)变长多字节编码    某些字符用一个字节表示,其它字符用两个或多个字符表示,变长多字节编码常用于对亚洲语言的支持,   例如日语、汉语、印地语等    例如:AL32UTF8(其中AL代表ALL,指适用于所有语言)、

    (2)定长多字节编码    每一个字符都使用固定长度字节的编码方案,目前oracle唯一支持的定长多字节编码是AF16UTF16,也是仅用于国家字符集

UTF-8是unicode的8位编码方式,是一种变长多字节编码,这种编码可以用1、2、3个字节表示一个unicode字符,AL32UTF8,UTF8、UTFE是UTF-8编码字符集 .如果需要存储多国语言文字,那就要选择UTF8了

2.1 字符集    实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。    Oracle的字符集命名遵循以下命名规则:    <Language><bit size><encoding>    即: <语言><比特位数><编码>    比如: ZHS16GBK表示采用GBK编码格式、16位(两个字节)简体中文字符集

2.2.3 unicode编码    Unicode是一个涵盖了目前全世界使用的所有已知字符的单一编码方案,也就是说Unicode为每一个字符提供唯一的编码。UTF-16是unicode的16位编码方式,是一种定长多字节编码,用2个字节表示一个unicode字符,AF16UTF16是UTF-16编码字符集。    UTF-8是unicode的8位编码方式,是一种变长多字节编码,这种编码可以用1、2、3个字节表示一个unicode字符,AL32UTF8,UTF8、UTFE是UTF-8编码字符集

2.4.1字符集    (1)用来存储CHAR, VARCHAR2, CLOB, LONG等类型数据    (2)用来标示诸如表名、列名以及PL/SQL变量等    (3)用来存储SQL和PL/SQL程序单元等

 

2.4.2国家字符集:    (1)用以存储NCHAR, NVARCHAR2, NCLOB等类型数据    (2)国家字符集实质上是为oracle选择的附加字符集,主要作用是为了增强oracle的字符处理能力,因为NCHAR数据类型可以提供对亚洲使用定长多字节编码的支持,而数据库字符集则不能。

国家字符集在oracle9i中进行了重新定义,只能在unicode编码中的AF16UTF16和UTF8中选择,默认值是AF16UTF16

       我们在创建数据库时,需要考虑的一个问题就是选择什么字符集与国家字符集(通过create database中的CHARACTER SET与NATIONAL CHARACTER SET子句指定)。考虑这个问题,我们必须要清楚数据库中都需要存储什么数据,如果只需要存储英文信息,那么选择US7ASCII作为字符集就可以;但是如果要存储中文,那么我们就需要选择能够支持中文的字符集(如ZHS16GBK);如果需要存储多国语言文字,那就要选择UTF8了。

有过一些Oracle使用经验的朋友,大多会知道通过NLS_LANG来设置客户端的情况,NLS_LANG由以下部分组成:NLS_LANG=<Language>_<Territory>.<Clients Characterset>,其中第三部分<Clients Characterset>的本意就是用来指明客户端操作系统缺省使用的字符集。所以按正规的用法,NLS_LANG应该按照客户端机器的实际情况进行配置,尤其对于字符集一项更是如此,这样Oracle就能够在最大程度上实现数据库字符集与客户端字符集的自动转换(当然是如果需要转换的话)。

字符集:将特定的符号集编码为计算机能够处理的数值;字符集间的转换:对于在源字符集与目标字符集都存在的符号,理论上转换将不会产生信息丢失;而对于在源字符集中存在而在目标字符集中不存在的符号,理论上转换将会产生信息丢失;数据库字符集:选择能够包含所有将要存储的信息符号的字符集;客户端字符集设置:指明客户端操作系统缺省使用的字符集。

但实际上总结起来也很简单,要想在字符集方面少些错误与麻烦,需要坚持两条基本原则:在数据库端:选择需要的字符集(通过create database中的CHARACTER SET与NATIONAL CHARACTER SET子句指定);在客户端:设置操作系统实际使用的字符集(通过环境变量NLS_LANG设置)。

很多人都遇到因为字符集不同而导入失败的情况,这涉及3方面的字符集,oracle server 端字符集.oracle clinet端字符集,dump文件字符集。在做数据导入时,需要这三个字符集一致才可以。

第一个方面:查看oracle server端的字符集,比较直观的做法:

SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.WE8MSWIN1252

第二方面:dump文件的字符集:

dump文件的第2个和第3个字节记录了dump文件的字符集。如果dump文件不大,几十M,可以用untraedit打开。看第2第3个字节,如果是0354,用一下sql查询

SQL>  select nls_charset_name(to_number('0354','xxxx')) from dual;

NLS_CHARSET_NAME(TO_NUMBER('0354','XXXX'
----------------------------------------
ZHS16GBK

SQL>


第三方面:oracele client端的字符集:

在windows下就是注册表里,oraclehome目录下,nls_lang ,还可以在doc下自己设置:

set nls_lang=AMERICAN_AMRICA.ZHS16GBK
这样只影响这个窗口里面的环境变量。
在unix平台下,就是环境变量。
echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK

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

[julia@oc2365548284 Desktop]$ echo $LANG
en_US.utf8
[julia@oc2365548284 Desktop]$ 
[julia@oc2365548284 Desktop]$ set LANG=ZH_CN.utf8
[julia@oc2365548284 Desktop]$ 看看看可能





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值