知识大全 关于ORACLE数据库中汉字显示乱码

Posted

篇首语:知识为进步之母,而进步又为富强之源泉。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 关于ORACLE数据库中汉字显示乱码相关的知识,希望对你有一定的参考价值。

关于ORACLE数据库中汉字显示乱码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   引言

  ORACLE数据库作为业界领先的数据库产品 近年来在国内大中型企业中得到了广泛的应用 虽然ORACLE数据库产品本身在本地化方面已做得相当成熟 但还是有不少用户反应汉字显示乱码的问题 如对同一数据库不同的用户对同一表中的username查询却得出了不同的结果

  “ORACLE??????”和“ORACLE中国有限公司” 显然结果中将中文字符显示为乱码 那么为什么呢?字符集的设置不当是影响ORACLE数据库汉字显示的关键问题

   关于字符集

  字符集是ORACLE为适应不同语言文字显示而设定的 用于汉字显示的字符集主要有ZHS CGB ZHS GBK US ASCII和UTF 等 字符集同时存在于服务器端和客户端 服务器端字符集是在安装ORACLE时指定的 字符集登记信息存储在ORACLE数据库字典的V$NLS_PARAMETERS表中;而客户端字符集是在系统注册表(WINDOWS系统)或在用户的环境变量(UNIX系统)中设定的

   字符集的构成与设定

  字符集的构成与设定方式分为客户端与服务器端两种

  ( )客户端字符集的构成与设定 客户端的字符集是由当前用户的环境变量NLS_LANG设定的 环境变量NLS_LANG的构成

  NLS_LANG=language_territory charset

  其中

  language 指定服务器消息的语言

  territory 指定服务器的日期和数字格式

  charset 指定字符集

  三个成分可以任意组合 例如

  AMERICAN_AMERICA US SCII

  SIMPLIFIED CHINESE_CHINA ZHS GBK

  AMERICAN_AMERICA ZHS GBK

  客户端字符集的设定方法针对不同操作系统设定方法稍有不同 WINDOWS系统是在注册表项 HKEY_LOCAL_MACHINE\\SOFARE\\ORACLE\\HOME \\NLS_LANG中设定;UNIX系统是在当前用户的环境变量中设定 如在当前用户的profile文件中增加一行如下代码

  NLS_LANG=SIMPLIFIED Chinese_CHINA ZHS GBK;export NLS_LANG

  ( )服务端字符集的构成与设定 服务端字符集的构成体现在数据字典表V$NLS_PARAMETERS的NLS_LANGUAGE NLS_TERRITORY NLS_CHARACTERSET三项取值上 其中NLS_CHARACTERSET的取值就是具体的数据库字符集

  如利用查询语句SQL>SELECT * FROM V$NLS_PARAMETERS;

  可得到如下结果

  PARAMETER VALUE

  

  NLS_LANGUAGE SIMPLIFIED CHINESE

  NLS_TERRITORY CHINA

  ……

  NLS_CHARACTERSET ZHS GBK

  ……

  即当前数据库使用的字符集是ZHS GBK

  数据库服务端的字符集是在创建数据时设定的 但可通过如下方法对已设定的字符集进行修改

  方法一 重建数据库 建立数据库时将数据库的字符集设定为所需字符集

  方法二 修改SYS PROPS$表 即用SYS用户登陆ORACLE后 利用下面语句修改相应的字符集并提交

  SQL>UPDATE PROPS$ SET VALUE$=’ZHS GBK‘

  WHERE NAME=’NLS_CHARACTERSET’;

  SQL>MIT;

  通过此种方法来更改数据库字符集 只对更改后的数据有效 即数据库中原来的数据仍以原字符集被存储

  另外 有的还利用CREATE DATABASE CHARACTER SET ZHS GBK命令暂时的修改字符集 当重启数据库后 数据库字符集将恢复原来的字符集

   常见的汉字乱码问题及解决方案

  要在客户端正确显示ORACLE数据库中的汉字信息 首先必须使客户端的字符集与服务器端的字符集一致;其次是加载到ORACLE数据库的数据字符集必须与服务器字符集一致 据此 汉字显示乱码的问题大致可以分为以下几种情况

  ( )客户端字符集与服务器端字符集不同 服务器端字符集与加载数据字符集一致 这种情况是最常见的 只要把客户端的字符集设置正确即可 具体解决方案

  第一步 查询V$NLS_PARAMETERS得到服务端的字符集

  SQL>SELECT * FROM V$NLS_PARAMETERS;

  第二步 根据服务端的字符集设定客户端的字符集 设定方法参见客户端的字符集的设定方式

  以UNIX系统为例 可在当前用户的profile文件中增加如下两行

  NLS_LANG=SIMPLIFIED Chinese_CHINA ZHS GBK

  export NLS_LANG

  ( )客户端字符集与服务器端字符集相同 服务器端字符集与加载数据字符集不一致 这种情况一般发生在ORACLE版本升级或重新安装数据库时选择了与原来数据库不同的字符集 而恢复加载的备份数据仍是按原字符集卸出的场合 另一种情况是加载从其它使用不同字符集的ORACLE数据库卸出的数据 在这两种情况中 不管客户端字符集与服务器端字符集是否一致都无法正确显示汉字 具体解决方案

  方案一 按服务端字符集的修改方法修改服务端字符集与加载数据字符集一致 然后导入数据

  方案二 利用数据格式转储 避开字符集带来的问题 即先将加载数据倒入到与其字符集一致的数据库中 然后再将数据要么按文本格式导出(数据量较小的情况下) 要么通过第三方工具(如POWER BUILDER ACCESS FOXPRO等)倒出数据 最后将倒出的数据导入到目标数据库中

  ( )客户端字符集与服务器端字符集不同 服务端字符集与输入数据字符集不同 这种情况是在客户端字符集与服务器端字符集不一致时 从客户端输入了汉字信息 输入的这些信息即便是把客户端字符集更改正确 也无法显示汉字 解决方案 修改客户端字符集与服务端字符集一致后 重新输入数据

  其中:

  sqlplus乱码解决

  export NLS_LANG=AMERICAN_AMERICA ZHS GBK (显示英文)

  或

  export NLS_LANG="SIMPLIFIED CHINESE"_CHINA zhs cgb

  (显示简体中文)

   结束语

cha138/Article/program/Oracle/201311/19051

相关参考

知识大全 Oracle数据库中汉字长度的问题

Oracle数据库中汉字长度的问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  问题  var

知识大全 解决oracle10g安装后的中文显示乱码

在安装完oracleg后由于jre默认使用的字体问题使得emdbcanetcanetmgr显示中文时出现□□字样的乱码下面来说明这个问题的解决办法  改变$ORACLE_HOME/jdk目录下的jre

知识大全 Oracle中的汉字显示

Oracle中的汉字显示  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracle以其强大的数

知识大全 oracle中的数据库乱码的原因与解决

  在SQL*Plus中用insert插进的都是中文的为什么一存入服务器后再select出的就是???    有的时候服务器数据先导出重装服务器再导入数据结果发生数据查询成???    ……    这

知识大全 关于oracle的查询结果的行列互换

  /*  在实际使用sql工作中总会碰到将某一列的值放到标题中显示就是总说的行列转换或者互换  比如有如下数据:  IDNAME      

知识大全 servlet实现从oracle数据库的blob字段中读出文件并显示

  /* *ReadFilejava * *Createdon年月日下午: */  packagejgwlapp;  importjavaio*;import*

知识大全 Oracle 8i中字符集乱码问题析及其解决办法

Oracle8i中字符集乱码问题析及其解决办法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一

知识大全 oracleem中按钮乱码解决办法

  一oracleem中按钮乱码解决办法:  修改jdk下面的字体  [oracle@racdb_]$cd$ORACLE_HOME/jdk/jre/lib/  [oracle@raclib]$mvfo

知识大全 oracle em 按钮乱码解决办法及em网页变成英文

一oracleem中按钮乱码解决办法:修改jdk下面的字体  复制代码代码如下:  [oracle@esopdb_]$cd$ORACLE_HOME/jdk/jre/lib/[oracle@esopli

知识大全 ajax+php中文乱码的解决

  由于XMLHTTP采用的是Unicode编码上传数据而一般页面采用的是gb这就造成显示页面时产生乱码而当在获取页面时的XMLHttp返回的是utf编码这就造成了显示产生乱码解决方法之一就是在PHP