oracle字符集导致乱码问题
今天是2013-12-04,今天深入研究一下oracle字符集的问题。
以前自己也遇到过 在使用exp/imp导出导入数据的时候存在乱码的情况,也在终端查看数据的时候显示乱码的情况,今天这篇笔记给自己拨开迷雾,在此感谢分享知识的人员。
我们在将数据存入 数据库 的时候通过数据库的字符集进行转换字符编码,然后存入数据库中,在数据库中字符集文件目录为(10G&11G):$ORACE_HOME/nls/data中。
可以查看数据库字符集信息如下:
SQL> select * from props$ where name like 'NLS_%';
NAME VALUE$ COMMENT$
------------------------------ ---------------------------------------- ----------------------------------------------------------------------
NLS_CSMIG_SCHEMA_VERSION 5 Character set migration utiltiy schema version #
NLS_LANGUAGE AMERICAN Language
NLS_TERRITORY AMERICA Territory
NLS_CURRENCY $ Local currency
NLS_ISO_CURRENCY AMERICA ISO currency
NLS_NUMERIC_CHARACTERS ., Numeric characters
NLS_CHARACTERSET WE8ISO8859P1 Character set
NLS_CALENDAR GREGORIAN Calendar system
NLS_DATE_FORMAT DD-MON-RR Date format
NLS_DATE_LANGUAGE AMERICAN Date language
NLS_SORT BINARY Linguistic definition
NAME VALUE$ COMMENT$
------------------------------ ---------------------------------------- ----------------------------------------------------------------------
NLS_TIME_FORMAT HH.MI.SSXFF AM Time format
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM Time stamp format
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR Time with timezone format
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR Timestamp with timezone format
NLS_DUAL_CURRENCY $ Dual currency symbol
NLS_COMP BINARY NLS comparison
NLS_LENGTH_SEMANTICS BYTE NLS length semantics
NLS_NCHAR_CONV_EXCP FALSE NLS conversion exception
NLS_NCHAR_CHARACTERSET AL16UTF16 NCHAR Character set
NLS_RDBMS_VERSION 10.2.0.1.0 RDBMS version for NLS parameters
21 rows selected.
SQL>
在创建数据库的时候就需要指定字符集和国家字符集,字符集一旦选择后续改变会 存在相应风险,因此刚刚创建数据库时候选择合适的字符集尤为重要。
我们可以通过oracle自带的一个 oracle localle builder工具查数据库中字符集文件,对于linux或是unix该命令在$ORALE_HOME/nls/lbuilder/lbuilder,如我当前字符集为WE8ISO8859P1 :
并且可以找到字符的映射表,正是由于映射表的存在才知道每个编码代表的含义:
例如:
SQL> select nls_charset_id('WE8ISO8859P1') from dual;
NLS_CHARSET_ID('WE8ISO8859P1')
------------------------------
31
SQL> select dump('rhys') from dual;
DUMP('RHYS')
-----------------------------
Typ=96 Len=4: 114,104,121,115
SQL> select to_char('114','xxxxx') from dual;
TO_CHA
------
72
SQL> select to_number('72','xxxxx') from dual;
TO_NUMBER('72','XXXXX')
-----------------------
114
SQL> select chr(114) from dual;
C
-
r
SQL> select to_char('104','xxxx' ) from dual;
TO_CH
-----
68
SQL> select to_char('114','xxxx'),to_char('104','xxxx'),to_char('121','xxxxxx'),to_char('115','x