解析Oracle三大类型的字符集

    作者:课课家教育更新于: 2017-05-08 15:03:46

      Oracle数据库有国家字符集(nationalcharacterset)与数据库字符集(databasecharacterset)之分。两者都是在创建数据库时需要设置的。国家字符集主要是用于NCHAR、NVARCHAR、NCLOB类型的字段数据,而数据库字符集使用很广泛,它用于:CHAR、VARCHAR、CLOB、LONG类型的字段数据。

         我们都知道Oracle字符集问题,可以分成三类:即,数据库字符集,sqlplus的字符集(客户端字符集),以及终端程序的字符集(非Oracle的),以下的文章就是对Oracle字符集三种类型的主要描述。

      1、数据库字符集

    全面解析Oracle字符集的三大类型_ Oracle字符集_服务器_数据库_课课家教育

      数据库字符集是所有字符问题的核心,只有数据库本身的字符集正确了,客户端的字符集才可能正确。这里只的客户端包括sqlplus以及我们自己读数据库的应用程序。

      在定位问题时,我们需要先看看数据库当前是什么Oracle字符集。

      1)查询数据库字符集

      select*fromnls_database_parameters

      其中nls_language表示了显示方式,就是sqlplus的程序的显示字体,有SIMPLIFIEDCHINESE,Americanamerica

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

      2)修改数据库字符集

      当发现数据库字符集不正确时,如我们期望时GBK的,而数据库当前是其他的,从而引起中文乱码。这时我们需要修改数据库字符集。步骤如下:

      $sqlplus/nolog

      SQL>conn/assysdba;

      若此时数据库服务器已启动,则先执行SHUTDOWNIMMEDIATE命令关闭数据库服务器,然后执行以下命令:

      SQL>STARTUPMOUNT;

      SQL>ALTERSYSTEMENABLERESTRICTEDSESSION;

      SQL>ALTERSYSTEMSETJOB_QUEUE_PROCESSES=0;

      SQL>ALTERSYSTEMSETAQ_TM_PROCESSES=0;

      SQL>ALTERDATABASEOPEN;

      SQL>ALTERDATABASECHARACTERSETZHS16GBK;

      SQL>ALTERDATABASEnationalCHARACTERSETZHS16GBK;

      SQL>SHUTDOWNIMMEDIATE;

      SQL>STARTUP

      查看客户端字符集(NLS_LANG)的方法

      如果系统是LinuxUnix平台,则也可以通过下面命令查看(前提是必须设置了NLS_LANG,否则查出来的是空值)

      [etl@m1~]$env|grepNLS_LANG

      NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

      [etl@m1~]$echo$NLS_LANG

      AMERICAN_AMERICA.ZHS16GBK

      如果系统是Windows平台,则可以通过下面命令查看:

      1:在运行里面,输入regedit进入注册表,HKEY_LOCAL_MACHINE\\SOFTWARE\\ORACLE\\KEY_OraDb11g_home1\\里面(最后一项与实例名、数据库版本有关系),找到NLS_LANG选项,双击它,你就可以看到相应的值。

      2:echo%NLS_LANG%。如果没有设置NLS_LANG,用这个命令看不到相关信息。

      3:设置NLS_LANG的方法

      Windows平台:

      3.1

      setNLS_LANG=SIMPLIFIEDCHINESE_CHINA.ZHS16GBK

      setNLS_LANG=SIMPLIFIEDCHINESE_CHINA.ZHS16GBK

      3.2可以通过修改注册表键值永久设置

      HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/KEY_XXXX_home1/NLS_LANG

      UNIX&LINUX

      3.3

      exportNLS_LANG=AMERICAN_AMERICA.UTF8

      3.4可以编辑bash_profile文件进行永久设置

      vi.bash_profile

      exportNLS_LANG="SIMPLIFIEDCHINESE_CHINA.ZHS16GBK"

      客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,优先级关系为:SQLFunction>Altersession>环境变量>注册表>参数文件字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。

      Oracle字符集基本原理

      在搞懂Oracle字符集基本原理之前,一定要先分清以下三个概念:

      1.Oracle数据库服务器字符集:即Oracle以哪种字符编码存储字符,可以通过以下语句查出数据库字符集的设置。

      复制代码代码如下:

      SQL>select*fromv$nls_parameterswhereparameter='NLS_CHARACTERSET';

      PARAMETERVALUE

      -----------------------------------------------

      NLS_CHARACTERSETAL32UTF8

      2.客户端操作系统字符集:即客户端操作系统以哪种字符编码存储字符。

      如果是Windows,可以使用chcp命令获得代码页(codepage):

      复制代码代码如下:

      C:Usersxianzhu>chcp

      Activecodepage:936

      根据该代码页,到微软的官方文档《NationalLanguageSupport(NLS)APIReference》找到其对应的字符集。

      如果是Linux,字符集在/etc/sysconfig/i18n设置:

      复制代码代码如下:

      LANG="zh_CN.GB2312"(指定当前操作系统的字符集)

      SUPPORTED="zh_CN.GB2312"(指定当前操作系统支持的字符集)

      SYSFONT="lat0-sun16"(指定当前操作系统的字体)

      2、客户端字符集

    如果服务器端的Oracle字符集是正确的,而在客户端下,如sqlplus仍然不能正确显示中文,这一般是由于服务器端的字符集设定与客户端的字符集设定不同造成的。

      如果服务器端的Oracle字符集是正确的,而在客户端下,如sqlplus仍然不能正确显示中文,这一般是由于服务器端的字符集设定与客户端的字符集设定不同造成的。只要将两者修改一致就可以解决问题。

      1)查询客户端字符集

      elect*fromnls_instance_parameters

      客户端字符集环境select*fromnls_instance_parameters,其来源于v$parameter,

      表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表

      selectuserenv('language')fromdual;

      会话字符集环境select*fromnls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是altersession完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。

      客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,altersession>环境变量>注册表>参数文件

      字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如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中键入

      setnls_lang="Simplifiedchinese_china.utf8"

      setnls_lang="american_america.us7ascii"

      setnls_lang="american_america.zhs16gbk"

      setnls_lang="Simplifiedchinese_china.zhs16gbk"

      setnls_lang=".utf8"

      setnls_lang=".zhs16gbk"

      setnls_lang=".us7ascii"

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

      3、终端字符集

    如果数据库字符集和sqlplus的字符集一致,还是不能正确显示了,那很可能就是你的终端应用程序的Oracle字符集不支持了.例如你用bash登陆sqlplus,如果你的bash是个小字符集,那么就不能正常显示了.linux修改bash的字符集,可以先键入locale,看有哪些环境变量,再用export设置.

      如果数据库字符集和sqlplus的字符集一致,还是不能正确显示了,那很可能就是你的终端应用程序的Oracle字符集不支持了.例如你用bash登陆sqlplus,如果你的bash是个小字符集,那么就不能正常显示了.linux修改bash的字符集,可以先键入locale,看有哪些环境变量,再用export设置.

      Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。

    想要了解更多关于方面或者教程尽在课课家哦!

课课家教育

未登录