日期:2014-05-16  浏览次数:20485 次

字符集总结2

查当前数据库字符集
BYS@bys1>select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8
BYS@bys1>select * from nls_database_parameters;

PARAMETER                      VALUE
------------------------------ --------------------
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CURRENCY                   $
NLS_ISO_CURRENCY               AMERICA
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               AL32UTF8
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                DD-MON-RR
NLS_DATE_LANGUAGE              AMERICAN
NLS_SORT                       BINARY
NLS_TIME_FORMAT                HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXF
                               F AM

NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXF
                               F AM TZR

NLS_DUAL_CURRENCY              $
NLS_COMP                       BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE
NLS_NCHAR_CHARACTERSET         UTF8
NLS_RDBMS_VERSION              11.2.0.1.0


[oracle@bys001 ~]$ export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
[oracle@bys001 ~]$ echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK

显示字符使用的是操作系统的字符集,比如在中文WIN下,使用SSH登陆英文LINUX,
然后再用    SQLPLUS登陆到数据库进行查询,如果查询结果有汉字,则可以显示。
如果直接登陆英文LINUX,用 SQLPLUS登陆到数据库进行查询,是不能正常显示汉字的。

客户端字符集的设置是为了让数据库知道我们传递过去的字符是属于哪种字符集,
以便于ORACLE在存储字符时做相应的编码映射。


其实乱码,说到底就是用于显示字符的操作系统没有在字符编码中找到对应的字符导致的,造成这种现象的主要原因就是:
1:输入操作的os字符编码和查询的os字符编码不一致导致出现乱码。
2:输入操作的客户端字符集(nls_lang)和查询客户端字符集(nls_lang)不同,也可能导致查询返回乱码或者错误的字符。

还有一个问题需要解释一下:
在上面的例子中,相同的字符在不同的字符集中对应着不同的字符编码,这个通常称为字符集不兼容或者不完全兼容,比如zhs16gbk和al32utf8,他们存储的ascii码的字符编码都是相同的,但对于汉字却是不同的。
如果两个字符集对于相同的字符采用的相同的字符编码,我们称之为字符兼容,范围大的叫做范围小的字符集的超级。我们通常遇到的zhs16cgb231280,zhs16gbk就是这样的情况,后者是前者的超级。