字符集乱码总结
字符集乱码总结
查当前数据库字符集
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就是这样的情况,后者是前者的超级。