我们都知道Oracle字符集问题,可以分成三类: 即,数据库字符集, sqlplus的字符集(客户端字符集),以及 终端程序的字符集 (非Oracle的),以下的文章就是对Oracle字符集三种类型的主要描述。
1、数据库字符集
数据库字符集是所有字符问题的核心,只有数据库本身的字符集正确了,客户端的字符集才可能正确。这里只的客户端包括sqlplus以及我们自己读数据库的应用程序。
在定位问题时,我们需要先看看数据库当前是什么Oracle字符集。
1)查询数据库字符集
- select * from nls_database_parameters
其中 nls_language表示了显示方式, 就是sqlplus的程序的显示字体,有SIMPLIFIED CHINESE,American america
其中 nls_characterset是字符集设定, 常用的一些Oracle字符集有UTF8,US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK, AL32UTF8
2)修改数据库字符集
当发现数据库字符集不正确时,如我们期望时GBK的,而数据库当前是其他的,从而引起中文乱码。这时我们需要修改数据库字符集。步骤如下:
- $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
2 客户端字符集
如果服务器端的Oracle字符集是正确的,而在客户端下,如sqlplus仍然不能正确显示中文,这一般是由于服务器端的字符集设定与客户端的字符集设定不同造成的。只要将两者修改一致就可以解决问题。
1)查询客户端字符集
- elect * from nls_instance_parameters
客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,
表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
- select userenv('language') from dual;
会话字符集环境 select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。
客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件
字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如Oracle字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。 或者.zhs16gbk。注意zhs16gbk前面那个点是必须的哦!!
2) 修改客户端字符集
Oracle 的sqlplus会去读取OS中环境变量下的nls_lang信息
NSL_LANG包括三个部分(语言_地区.字符集)就是V$NLS_PARAMETERS表中的NLS_LANGUAGE,NLS_TERRITORY,NLS_CHARACTERSET
例如可以在cmd中键入
- set nls_lang="Simplified chinese_china.utf8"
- set nls_lang="american_america.us7ascii"
- set nls_lang="american_america.zhs16gbk"
- set nls_lang="Simplified chinese_china.zhs16gbk"
- set nls_lang=".utf8"
- set nls_lang=".zhs16gbk"
- set nls_lang=".us7ascii"
unix下类似, 不过nls_lang要大写NLS_LANG, 在.profile或这.bash_profile(根据你用的shell)里更改NLS_LANG可以长久保持环境变量值.
3、终端字符集
如果数据库字符集和sqlplus的字符集一致, 还是不能正确显示了, 那很可能就是你的终端应用程序的Oracle字符集不支持了. 例如你用bash登陆sqlplus, 如果你的bash是个小字符集, 那么就不能正常显示了.linux修改bash的字符集, 可以先键入locale, 看有哪些环境变量, 再用export设置.
【编辑推荐】
- Oracle 字符串split的相关实际应用代码介绍
- Oracle 10G for linux常用命令浅析
- Oracle数据库中归档进程ARCH的详细阐述
- Oracle索引整理的详细描述
- Oracle merge into的实操示例