2009-11-04 16:51:56| 分类: oracle 字符集 | 标签: |举报 |字号大中小 订阅
数据库字符集和国家字符集
在创建数据库的sql中有character set和national character set指定.
数据库字符集用来存放char,varchar2,clob,long等类型数据,sql及pl/sql程序单元等
国家字符集用来存放nchar,nvarchar2,nclob,nlong等类新数据.
oracle字符集命名规则
<language><比特位数><字符编码>
如zhs16gbk表示语言为中文,采用双字节16位编码,gbk编码。
us7ascill表示语言为英语,采用单字节7位编码,ascill编码。
如何取得客户端操作系统的当前字符集
window操作系统,用chcp,如结果为936,则代表为zhs16gbk,具体可以去微软网站查询。
Unix 操作系统,用echo $NLS_LANG 或者env|grep NLS_LANG
如何查看客户端的字符集设置
客户端字符集通过nls_lang来设置,nls_lang的格式
<languguage>_<territory>.<字符集>
如nls_lang=American_America.us7ascii
window操作系统,用echo %NLS_LANG%
Unix 操作系统,用echo $NLS_LANG 或者env|grep NLS_LANG
如何查看数据库字符集
dba用户可以查数据字典表props及nls_database_parameters
SQL> select name,value$ from props$;
NLS_CHARACTERSET ZHS16CGB231280
select * from nls_database_parameters;
NLS_CHARACTERSET ZHS16CGB231280
普通用户可以用userenv这个函数去查看当前数据库的字符集
SQL> SELECTUSERENV('LANGUAGE')FROM DUAL;
USERENV('LANGUAGE')
--------------------------------------------
AMERICAN_AMERICA.ZHS16CGB231280
Exp/imp导入导出涉及的字符集问题
1:Exp的时候,设置客户端的字符集和导出数据库的字符集一致,这样,导出文件将和导出数据库具有相同的字符集,避免了导出数据库与导出文件之间的字符集转换
2:导入的时候,设置客户端的字符集为导出文件的字符集,这样避免了导出文件与导入客户端字符集的转换,如果此时导入客户端字符集不等于数据库字符集,那么在数据库会负责导入客户端字符集到数据库字符集的转换。
3:导出的时候,导出客户端的字符集存放在导出文件的第二,三个字节(16进制),下面的二个函数可以帮助我们识别字符集编码和数值之间的关系。
SQL> select nls_charset_name(852) from dual;
NLS_CHARSET_NAME
----------------
ZHS16GBK
SQL> select nls_charset_ID('ZHS16CGB231280') FROM DUAL;
NLS_CHARSET_ID('ZHS16CGB231280')
--------------------------------
850
关于字符集的修改
一:alter database character set zhs16cgb231280
可以用在子集到超级的修改
二:alter database character set internal_use zhs16cgb231280
该语句不受子集和超集的限制,强制性转换
(修改前,切记要备份)
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL> startup mount
ORACLE例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL>alter system enable restricted session;
系统已更改。
SQL>alter system set job_queue_processes=0;
系统已更改。
SQL>alter system set aq_tm_processes=0;
系统已更改。
SQL> alter database open;
数据库已更改。
SQL>alter database character set internal_use zhs16cgb231280;
数据库已更改。
评论