Linux 下更改 oracle 客户端字符集和服务端字符集
1.Linux 下更改 oracle 客户端字符集,即设置环境变量“ NLS_LANG“ 的值
查看客户端字符集,在终端下执行:
echo $NLS_LANG
修改客户端字符集:
sudo gedit /etc/environment
在environment 文件中增加以下内容:
NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
export NLS_LANG
重新启动操作系统即可。
2. 修改 oracle 服务端的字符集。
查看服务端字符集:
select userenv('language') from dual;
修改服务端字符集,终端下执行:
$ORACLE_HOME/bin/sqlplus /nolog
进入sqlplus 命令行
SQL>conn / as sysdba;
1 ) . 关闭数据库
SQL>SHUTDOWN IMMEDIATE;
2 ) . 启动到 Mount
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
-- 下面一行语句可能会出现错误提示,可以不理会
ALTER DATABASE national CHARACTER SET INTERNAL ZHS16GBK;
SHUTDOWN IMMEDIATE;
STARTUP;
3. 修改 dmp 文件字符集
dmp 文件的第2 第3 字节记录了字符集信息,因此直接修改dmp 文件的第2 第3 字节的内容就可以‘骗’过oracle 的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如 US7ASCII ,WE8ISO8859P1 ,ZHS16CGB231280 ,ZHS16GBK 基本都可以改。因为改的只是dmp 文件,所以影响不大。
具体的修改方法比较多,最简单的就是直接用UltraEdit 修改dmp 文件的第2 和第3 个字节。比如想将dmp 文件的字符集改为ZHS16GBK ,可以用以下SQL 查出该种字符集对应的16 进制代码:
SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;
0354
然后将dmp 文件的2 、3 字节修改为0354 即可。
Oracle 提供标准函数,对字符集名称及 ID 进行转换 :
SQL> select nls_charset_id('ZHS16GBK') from dual;
NLS_CHARSET_ID('ZHS16GBK')
--------------------------
852
1 row selected.
SQL> select nls_charset_name(852) from dual;
NLS_CHAR
--------
ZHS16GBK
1 row selected.
十进制转换十六进制 :
SQL> select to_char('852','xxxx') from dual;
TO_CH
-----
354
参考文章:
《Oracle 字符集的查看和修改》:
http://blog.csdn.net/tianlesoftware/archive/2009/12/02/4915223.aspx
《字符集问题的初步探讨( 五)- 导出文件字符集》:
http://www.eygle.com/special/NLS_CHARACTER_SET_05.htm