星期日, 十一月 26, 2006

彻底了解Oracle字符集问题

字符集问题分为三个阶段: 数据库字符集, sqlplus的字符集(客户端字符集), 终端程序的字符集

1. 查询数据库字符集

select * from V$NLS_PARAMETERS;

其中

l nls_language表示了显示方式, 就是sqlplus的程序的显示字体,有SIMPLIFIED CHINESE,American america

l nls_characterset是字符集设定, 常用的一些字符集有UTF8,US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK, AL32UTF8

2。修改数据库字符集
$sqlplus /nolog
SQL>conn / as sysdba;
  若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,然后执行以下命令:
SQL>STARTUP MOUNT;
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 ZHS16GBK;
SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP
3。修改客户端字符集

oracle 的sqlplus会去读取OS中环境变量下的nls_lang信息

NSL_LANG包括三个部分语言_地区.字符集就是V$NLS_PARAMETERS表中的NLS_LANGUAGE,NLS_TERRITORY,NLS_CHARACTERSET

例如可以在cmd中键入

l set nls_lang="Simplified chinese_china.utf8"

l set nls_lang="american_america.us7ascii"

l set nls_lang="american_america.zhs16gbk"

unix下类似, 不过nls_lang要大写NLS_LANG, 在.profile或这.bash_profile(根据你用的shell)里更改NLS_LANG可以长久保持环境变量值.

4。解决查询时显示中文部分显示乱字符

这一般是由于服务器端的字符集设定与客户端的字符集设定不同造成的。只要将两者修改一致就可以解决问题。

5. 终端应用程序的字符集

如果数据库字符集和sqlplus的字符集一致, 还是不能正确显示了, 那很可能就是你的终端应用程序的字符集不支持了. 例如你用bash登陆sqlplus, 如果你的bash是个小字符集, 那么就不能正常显示了.

linux修改bash的字符集, 可以先键入locale, 看有哪些环境变量, 再用export设置.

6。导入数据时提示字符集不匹配问题
exp/imp与sql*plus一样是客户端产品,因此他的字符集是由服务端的nls_lang所设定的。用exp导出备份的export file时,字符集的设定也被存放在export file里。这就是有些人在imp发生字符无法转换时更改export file文件头的原理

没有评论: